2013-06-13 3 views
0

필자는 시추공 지질 학적 데이터를 가지고 있으며, 지표면으로부터 약간의 총 깊이까지의 깊이로 정렬되어 있습니다. 서로 다른 해상도로 하나씩 결합하려는 여러 세트가 있습니다. 가장 높은 해상도의 데이터 세트는 필요한 출력 해상도를 가지고 있습니다 (깊이가 고르게 분포되어 있지만 다른 것은 그렇지 않습니다). 이 중 많은 부분을 관리해야하므로 수동 스프레드 시트 편집이 너무 오래 걸립니다.R에서 두 개의 정렬 된 시리즈를 어떻게 조합합니까?

예를 들어, 여기에 고해상도의 데이터의 일부는 선택된 깊이 범위 (약 151--152)에 있습니다 :

data <- 
structure(list(DEPTH = c(150.876, 151.0284, 151.1808, 151.3332, 
151.4856, 151.638, 151.7904, 151.9428, 152.0952, 152.2476), DT = c(435.6977, 
437.6732, 441.4934, 444.6542, 445.771, 444.4603, 443.5679, 444.5042, 
447.3567, 450.4373), GR = c(13.8393, 14.549, 15.7866, 16.9114, 
18.4841, 18.8695, 17.7494, 16.7178, 12.8839, 11.7309)), .Names = c("DEPTH", 
"DT", "GR"), row.names = c(NA, -10L), class = "data.frame") 

(전체 로그 데이터 파일이 훨씬 더 큰, 그래서 돈 ' 대신에 다음 데이터 세트의 간격과 일치하는 부분을 취 했으므로 analyses)

깊이가있는 몇 가지 저해상도 이산 수치 데이터 위의 데이터는 logs과 다릅니다. 범위 부등 깊이 데이터와 약간 아래 입술 범주 데이터

analyses <- 
structure(list(from = c(151L, 198L, 284L, 480L), to = c(151.1, 
198.1, 284.1, 480.1), TC = c(1.276476312, 1.383553608, 1.46771308, 
1.125049954), DEN = c(1.842555733, 1.911724824, 1.997592565, 
NA), PORO = c(50.21947697, 44.26392579, 39.31309757, NA)), .Names = c("from", 
"to", "TC", "DEN", "PORO"), class = "data.frame", row.names = c(NA, 
-4L)) 

: 그리고

units <- 
structure(list(from = c(0, 100, 450, 535, 617.89), to = c(100, 
450, 535, 617.89, 619.25), strat = structure(c(5L, 1L, 2L, 3L, 
4L), .Label = c("Formation A", "Formation B", 
"Group C", "Group D", "Unassigned"), class = "factor")), .Names = c("from", 
"to", "strat"), class = "data.frame", row.names = c(NA, -5L)) 
이 데이터는 특정 깊이의 범위에서 소정 길이의 샘플 간격을 나타내고, 주어진 범위에 따라 변하지 않는다

의도 한 결과는 첫 번째 데이터 집합 logs의 해상도에서 두 번째 및 세 번째 데이터를 병합 한 데이터입니다. 이 경우,이 데이터 프레임을 초래할 것이다 :

DEPTH DT GR TC DEN PORO Unit 
150.8760 435.69 13.83 NA NA NA Formation A 
151.0284 437.67 14.54 1.27 1.84 50.21 Formation A 
151.1808 441.49 15.78 NA NA NA Formation A 
151.3332 444.65 16.91 NA NA NA Formation A 
151.4856 445.77 18.48 NA NA NA Formation A 
151.6380 444.46 18.86 NA NA NA Formation A 
151.7904 443.56 17.74 NA NA NA Formation A 
151.9428 444.50 16.71 NA NA NA Formation A 
152.0952 447.35 12.88 NA NA NA Formation A 
152.2476 450.43 11.73 NA NA NA Formation A 

내가 간극을 채우기 위해 na.approx을 이용하여 다음 데이터 프레임을 병합하고했지만, 문제가 logs에서 많은 변수가 NaN이있다이다 또는 값을 보간하고 싶지 않은 NAs - 그들은 NAs로 남아 있어야합니다.

+2

의도 한 결과를 포함하십시오. – Roland

+0

예, 처음으로 넣었어야합니다. 나는 지금 가지고있다. –

답변

1

merge 또는 sqldf으로 data.frames에 가입 할 수 있습니다.

library(sqldf) 

# If you know that each depth (in the first data.frame) 
# is in exactly one interval (in the second and third data.frames) 
sqldf(" 
    SELECT * 
    FROM data A, analyses B, units C 
    WHERE B.[from] <= A.DEPTH AND A.DEPTH < B.[to] -- Need to quote some of the column names 
    AND C.[from] <= A.DEPTH AND A.DEPTH < C.[to] 
") 

# If each depth (in the first data.frame) 
# is in at most one interval (in the second and third data.frames) 
sqldf(" 
    SELECT * 
    FROM data A 
    LEFT JOIN analyses B ON B.[from] <= A.DEPTH AND A.DEPTH < B.[to] 
    LEFT JOIN units C ON C.[from] <= A.DEPTH AND A.DEPTH < C.[to] 
    ORDER BY DEPTH 
") 
+0

이것은 정말 유용하게 보입니다. 그러나 R 2.14를 사용 중이며 의존성에 2.15가 필요하므로 아직 시도하지 못했습니다. 업그레이드를 시도하고 알려드립니다. –

+0

그래, 그 두 번째 쿼리가 그것을 않습니다. 훌륭해, 고마워. 전에는 한 번도 범위에 가입하지 않았습니다. –

관련 문제