R:循环合并数据帧并cbind这些

R:循环合并数据帧并cbind这些,r,loops,merge,dataframe,R,Loops,Merge,Dataframe,我有一个类似[]的问题 以下是这个问题的数据: df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e')) df2 = data.frame(x=c('a', 'b', 'c'),y = c(0,1,0)) df3 = data.frame(x=c('a', 'b', 'c', 'd'),y = c(1,1,1,0)) df4 = data.frame(x=c('b', 'a', 'e'),y = c(0,1,0)) zz <- merge(df1, d

我有一个类似[]的问题

以下是这个问题的数据:

df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e'))
df2 = data.frame(x=c('a', 'b', 'c'),y = c(0,1,0)) 
df3 = data.frame(x=c('a', 'b', 'c', 'd'),y = c(1,1,1,0))
df4 = data.frame(x=c('b', 'a', 'e'),y = c(0,1,0))
zz <- merge(df1, df2, all = TRUE)
zz[is.na(zz)] <- 0

我不确定我是否正确理解你想要什么,但像这样

> zz <- Reduce(function(a,b)merge(a,b,all=TRUE, by="x"), list(df1, df2, df3, df4))
> zz[is.na(zz)] <- 0
> zz
  x y.x y.y y
1 a   0   1 1
2 b   1   1 0
3 c   0   1 0
4 d   0   0 0
5 e   0   0 0
>zzzz[is.na(zz)]zz
x y.x y.y
1 a 0 1 1
2b110
3C01 0
4d00
5 e 0 0 0
您可以通过使用Reduce来避免循环,但请注意,它并不一定会导致性能改进

如果需要单独的数据帧,那么Map(只是mapply的包装器)很有用:

> zz <- Map(function(b)merge(df1,b,all=TRUE, by="x"), list(df2, df3, df4))
> zz
[[1]]
  x  y
1 a  0
2 b  1
3 c  0
4 d NA
5 e NA

[[2]]
  x  y
1 a  1
2 b  1
3 c  1
4 d  0
5 e NA

[[3]]
  x  y
1 a  1
2 b  0
3 c NA
4 d NA
5 e  0
>zz-zz
[[1]]
xy
1 a 0
2 b 1
3C0
4dNA
5 e NA
[[2]]
xy
1 a 1
2 b 1
3 c 1
4d0
5 e NA
[[3]]
xy
1 a 1
2B0
3c-NA
4dNA
5 e 0
然后通过do.call找到他们

> zz <- do.call("cbind", zz)
> zz[is.na(zz)] <- 0
> zz
  x y x y x y
1 a 0 a 1 a 1
2 b 1 b 1 b 0
3 c 0 c 1 c 0
4 d 0 d 0 d 0
5 e 0 e 0 e 0
>zzzz[is.na(zz)]zz
x y x y x y
1 a 0 a 1 a 1
2b1b1b0
3c0c1c0
4d0d0d0
5e0e0e0

我不确定我是否正确理解你想要什么,但像这样

> zz <- Reduce(function(a,b)merge(a,b,all=TRUE, by="x"), list(df1, df2, df3, df4))
> zz[is.na(zz)] <- 0
> zz
  x y.x y.y y
1 a   0   1 1
2 b   1   1 0
3 c   0   1 0
4 d   0   0 0
5 e   0   0 0
>zzzz[is.na(zz)]zz
x y.x y.y
1 a 0 1 1
2b110
3C01 0
4d00
5 e 0 0 0
您可以通过使用Reduce来避免循环,但请注意,它并不一定会导致性能改进

如果需要单独的数据帧,那么Map(只是mapply的包装器)很有用:

> zz <- Map(function(b)merge(df1,b,all=TRUE, by="x"), list(df2, df3, df4))
> zz
[[1]]
  x  y
1 a  0
2 b  1
3 c  0
4 d NA
5 e NA

[[2]]
  x  y
1 a  1
2 b  1
3 c  1
4 d  0
5 e NA

[[3]]
  x  y
1 a  1
2 b  0
3 c NA
4 d NA
5 e  0
>zz-zz
[[1]]
xy
1 a 0
2 b 1
3C0
4dNA
5 e NA
[[2]]
xy
1 a 1
2 b 1
3 c 1
4d0
5 e NA
[[3]]
xy
1 a 1
2B0
3c-NA
4dNA
5 e 0
然后通过do.call找到他们

> zz <- do.call("cbind", zz)
> zz[is.na(zz)] <- 0
> zz
  x y x y x y
1 a 0 a 1 a 1
2 b 1 b 1 b 0
3 c 0 c 1 c 0
4 d 0 d 0 d 0
5 e 0 e 0 e 0
>zzzz[is.na(zz)]zz
x y x y x y
1 a 0 a 1 a 1
2b1b1b0
3c0c1c0
4d0d0d0
5e0e0e0

@Samantha我把一段代码放到列表中。可能最好显示输入(即数据)和所需输出的示例,以明确您的问题所在。您的第一个输出zz是正确的,但代码在循环中,因此我认为没有办法在循环中使用此代码。(zz@Samantha我把一段代码放在一个列表中,
cbind
s。可能最好显示输入(即数据)和所需输出的示例,以明确您的问题所在。您的第一个输出zz是对的,但代码在一个循环中,因此我认为没有办法在循环中使用此代码。(zz代码无法运行。什么是
xx2
?代码无法运行。什么是
xx2