2016-09-12 3 views
2

I가리스트 등 등이 있다고 가정 I 열 n와 의한 목록의 각 데이터 프레임의 첫 번째 두 열의 합병이다 원하던올라가지 및 R에 데이터 프레임 열을 선택 병합

df1<-data.frame(n=letters[1:4], x=1:4, y=2:5, z=3:6) 
df2<-data.frame(n=letters[2:5], x=2:5, y=3:6, z=4:7) 
df3<-data.frame(n=letters[3:7], x=2:6, y=3:7, z=4:8) 
ls<-list(df1, df2, df3) 
ls 
[[1]] 
    n x y z 
1 a 1 2 3 
2 b 2 3 4 
3 c 3 4 5 
4 d 4 5 6 

[[2]] 
    n x y z 
1 b 2 3 4 
2 c 3 4 5 
3 d 4 5 6 
4 e 5 6 7 

[[3]] 
    n x y z 
1 c 2 3 4 
2 d 3 4 5 
3 e 4 5 6 
4 f 5 6 7 
5 g 6 7 8 

원하는 출력 될 것이다 : 대

n x1 x2 x3 
1 a 1 NA NA 
2 b 2 2 NA 
3 c 3 3 2 
4 d 4 4 3 
5 e NA 5 4 
6 f NA NA 5 
7 g NA NA 6 

와 똑같이 Y 및 Z :

n y1 y2 y3 
1 a 2 NA NA 
2 b 3 3 NA 
3 c 4 4 3 
4 d 5 5 4 
5 e NA 6 5 
6 f NA NA 6 
7 g NA NA 7 

    n z1 z2 z3 
1 a 3 NA NA 
2 b 4 4 NA 
3 c 5 5 4 
4 d 6 6 5 
5 e NA 7 6 
6 f NA NA 7 
7 g NA NA 8 

답변

3

listunique 열 이름은 'n'('nm1')을 제외한 data.frame을 제외하고 그 (lapply(nm1,...)을 반복하며 'ls'(lapply(ls, function(x) ...)의 'data.frame' merge과 함께 Reduce을 사용하여 list의 데이터 세트를 병합하십시오.

nm1 <- setdiff(unlist(lapply(ls, names)), "n") 
lapply(nm1, function(nm) setNames(Reduce(function(...) 
    merge(..., all=TRUE, by = "n"), lapply(ls, 
       function(x) x[c("n", nm)])), make.unique(c("n", rep(nm, length(nm1)))))) 
#[[1]] 
# n x x.1 x.2 
#1 a 1 NA NA 
#2 b 2 2 NA 
#3 c 3 3 2 
#4 d 4 4 3 
#5 e NA 5 4 
#6 f NA NA 5 
#7 g NA NA 6 

#[[2]] 
# n y y.1 y.2 
#1 a 2 NA NA 
#2 b 3 3 NA 
#3 c 4 4 3 
#4 d 5 5 4 
#5 e NA 6 5 
#6 f NA NA 6 
#7 g NA NA 7 

#[[3]] 
# n z z.1 z.2 
#1 a 3 NA NA 
#2 b 4 4 NA 
#3 c 5 5 4 
#4 d 6 6 5 
#5 e NA 7 6 
#6 f NA NA 7 
#7 g NA NA 8 

참고 : ls은 개체를 나열하는 함수 이름입니다. 알려진 R 함수를 사용하여 객체의 이름을 지정하지 않는 것이 좋습니다.

1

, data.framecbind을 중첩 된 쌍의 lapply 함수 내에 사용하는 또 다른 기본 R 메서드입니다.

# get all levels of n across data frames 
allN <- unique(unlist(sapply(ls, "[[", "n"))) 
# extract desired columns and provide names with setNames 
lapply(names(ls[[1]])[-1], function(var) { 
     cbind("n"=allN, setNames(do.call(data.frame, 
     lapply(seq_along(ls), function(i) { 
           ls[[i]][[var]][match(allN, ls[[i]]$n, nomatch=NA)] 
           })), paste0(var, seq_along(ls)))) 
}) 

변수 이름 각각 내지 제 lapply 실행은 제 2 lapply 목록의 각 데이터 프레임으로부터 현재의 변수를 추출한다. 중간에 do.call은 목록을 data.frame으로 만들고 setNames은 원하는 이름을 제공하고 n 열은 cbind으로 추가됩니다.

내부의 lapply의 가장 안쪽 부분에서 코드 ls[[i]][[var]][match(allN, ls[[i]]$n, nomatch=NA)]은 allN의 레벨에 따라 현재 벡터를 확장 (잠재적으로 재정리)하는 데 사용됩니다. 현재 벡터에 레벨이없는 경우 nomatch = NA는 match에 대신 NA을 반환하도록 지시합니다.

관련 문제