2013-05-26 2 views
2

새로운 dataframe에서 값을 반환 :R이>의 값은, 나는 다음과 같은 형식의 데이터가

structure(list(cat = structure(c(1L, 2L, 3L, 1L, 2L, 2L, 3L, 
3L, 3L, 3L, 1L, 2L), .Label = c("A", "B", "C"), class = "factor"), 
ID = structure(c(1L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 2L, 
3L, 4L), .Label = c("s1", "s10", "s11", "s12", "s2", "s3", 
"s4", "s5", "s6", "s7", "s8", "s9"), class = "factor"), val = c(150, 
750, 950, 104, 726, 797, 890, 912, 994, 1004, 199, 704), 
LWR = c(100, 700, 900, NA, NA, NA, NA, NA, NA, NA, NA, NA 
), UPP = c(200, 800, 1000, NA, NA, NA, NA, NA, NA, NA, NA, 
NA)), .Names = c("cat", "ID", "val", "LWR", "UPP"), row.names = c(NA, 
-12L), class = "data.frame") 

보이는 같은 :

cat ID val LWR UPP 
1 A s1 150 100 200 
2 B s2 750 700 800 
3 C s3 950 900 1000 
4 A s4 104 NA NA 
5 B s5 726 NA NA 
6 B s6 797 NA NA 
7 C s7 890 NA NA 
8 C s8 912 NA NA 
9 C s9 994 NA NA 
10 C s10 1004 NA NA 
11 A s11 199 NA NA 
12 B s12 704 NA NA 

내가 원하는 무엇 LWR 또는 UPP 값 중 가장 가까운 고양이와 동일한 값을 가지는 val 열의 값을 찾습니다.

cat id val LWR UPP LS NLWR US NUPP 
1 A s1 150 100 200 s4 104 s11 199 
2 B s2 750 700 800 s12 704 s6 797 
3 C s3 950 900 1000 s8 912 s9 994 

새로운 coloums (LS 및 NLWR/미국 NUPP)는 단지 새로운 열 이름을 부여, 추출 된 행의 ID와 발스와 동일합니다 : 그것은 원하는 출력을보고 이해하는 것이 아마도 가장 쉬운 방법. 나는 다양한 형태의 "어느"를 사용하여 이것을 실행하려고 시도했지만 데이터를 개혁했지만 운이 없었습니다. 직접 할 수있는 방법이 있습니까, 아니면 항상 여러 단계를 거치게됩니까? 890 912 900에 가깝고 NUPP 대해 동일한 것을

+0

왜'cat' = A'val' = 199 인 행이 선택되어 있습니까? 그리고'cat' 값'LWR'과'UPP'가 한 번만 설정되기 때문에 항상 이렇게됩니까? – Beasterfield

+0

그렇습니다. 저는 100에서 200 사이의 값을 특별히 찾고 있다고 언급하는 것을 잊었습니다. 그리고 네, 각 고양이 가치는 하나의 경수로와 하나의 UPP를 가지고 있습니다. 내 실제 데이터는 샘플 3 대신에 약 5,000 개의 다른 고양이를 가지고 있습니다. – MHtaylor

답변

1
DF1 <- na.omit(DF) 
DF2 <- DF[is.na(DF$LWR),] 

library(plyr) 

ddply(DF1,.(cat),function(df) { 
    lwr <- which.min(abs(DF2$val-df$LWR)) 
    upp <- which.min(abs(DF2$val-df$UPP)) 

    df$LS <- DF2[lwr,"ID"] 
    df$NLWR <- DF2[lwr,"val"] 
    df$US <- DF2[upp,"ID"] 
    df$NUPP <- DF2[upp,"val"] 

    df 
}) 

# cat ID val LWR UPP LS NLWR US NUPP 
# 1 A s1 150 100 200 s4 104 s11 199 
# 2 B s2 750 700 800 s12 704 s6 797 
# 3 C s3 950 900 1000 s7 890 s10 1004 

참고. 값이 LWRUPP 사이 여야한다면 조정이 쉬워야합니다.

+0

저는이 값들과이 작은 샘플을 보면서 잘 작동하도록했습니다. 실제 데이터로 추정하려고하면 '고양이'연산자와 일치하지 않는 값의 문제가 발생합니다. 그룹간에 훨씬 더 많은 교차점이 있습니다. 이 문제를 해결하기 위해 노력하고 있지만 귀하의 대답은 처음에 질문 한 질문에 유용합니다! – MHtaylor

관련 문제