Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
取消列出选定列并将其合并到R中的数据帧_R - Fatal编程技术网

取消列出选定列并将其合并到R中的数据帧

取消列出选定列并将其合并到R中的数据帧,r,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

假设我有这样一个列表:

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
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

我们从
data.frame
列表中获取
唯一的
列名,除了'n'('nm1'),循环这些(
lappy(nm1,
),将'ls'中每个'data.frame'的列子集(
lappy(ls,function(x)…
),并使用
Reduce
,与
merge
合并
列表中的数据集

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

nm1这里是另一个base R方法,它在一对嵌套的
lapply
函数中使用
do.call
data.frame
cbind

# 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))))
})
#跨数据帧获取所有级别的n
阿伦
# 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))))
})