【问题标题】:R: loop to merge dataframes and cbind theseR:循环合并数据帧并 cbind 这些
【发布时间】:2011-08-23 21:40:12
【问题描述】:

我有一个类似 [] R: merge unequal dataframes and replace missing rows with 0

的问题

这是这个问题的数据:

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

在此示例中,我将 df1 与 df2 合并。现在我想创建一个循环来合并 df3 和 df4 以及更多带有 df1 的数据帧。问题是列表中的结果必须是cbind才能生成最终的dataframe。

谁能帮帮我?

谢谢!


编辑! 这是我创建的循环。变量 goterms 包含一个包含 10 个变量的列表。变量是感兴趣的GO中列表的名称。第一个感兴趣的GO被选中,计算的结果就是变量result。这个结果必须与 x 合并。因为它是一个循环,所以必须将所有 10 个结果都 cbind 以创建最终数据帧。

for (i in 1:length(goterms)){
  goilmn<-as.data.frame(interestedGO[i])
  resultILMN<-match(goilmn[,1], rownames(xx2),nomatch=0)
  resultILMN[resultILMN] <- 1
  result<-cbind(goilmn,resultILMN)
  colnames(result) <- c('x','result')

  zz<-merge(x, result, all=TRUE)
  resultloop<-zz[is.na(zz)]<-0
  standard[i]<-cbind(resultloop)
}

goterms:
[1] "GO:0009611" "GO:0007596" "GO:0050817" "GO:0061082" "GO:0007599"
[6] "GO:0050776" "GO:0006910" "GO:0034383" "GO:0019932" "GO:0002720"

interestedGO:
$`GO:0009611` 
[1] "ILMN_1651346" "ILMN_1651354" "ILMN_1651599" "ILMN_1651950" "ILMN_1652287"
[6] "ILMN_1652445" "ILMN_1652693" "ILMN_1652825" "ILMN_1653324" "ILMN_1653395"

$`GO:0007596`
[1] "ILMN_1651599" "ILMN_1652693" "ILMN_1652825" "ILMN_1653324" "ILMN_1655595"
[6] "ILMN_1656057" "ILMN_1659077" "ILMN_1659923" "ILMN_1659947" "ILMN_1662619"
[11] "ILMN_1664565" "ILMN_1665132" "ILMN_1665859" "ILMN_1666175" "ILMN_1668052"
[16] "ILMN_1670229" "ILMN_1670305" "ILMN_1670490" "ILMN_1670708"
"ILMN_1671766"                              

$`GO:0050817`
[1] "ILMN_1651599" "ILMN_1652693" "ILMN_1652825" "ILMN_1653324" "ILMN_1655595"
[6] "ILMN_1656057" "ILMN_1659077" "ILMN_1659923" "ILMN_1659947" "ILMN_1662619"
[11] "ILMN_1664565" "ILMN_1665132" "ILMN_1665859" "ILMN_1666175" "ILMN_1668052"
[16] "ILMN_1670229" "ILMN_1670305" "ILMN_1670490" "ILMN_1670708" "ILMN_1671766"
[21] "ILMN_1671928" "ILMN_1675083" "ILMN_1678049" "ILMN_1678728" 
"ILMN_1680805"                            

$`GO:0061082`
[1] "ILMN_1661695" "ILMN_1665132" "ILMN_1716446" "ILMN_1737314" "ILMN_1772387"
[6] "ILMN_1784863" "ILMN_1796094" "ILMN_1800317" "ILMN_1800512" "ILMN_1807074"

x 是所有 ILMN 代码的引用。这是 x 变量的头部。 x[1:100,]

 [1] ILMN_1343291 ILMN_1343295 ILMN_1651228 ILMN_1651229 ILMN_1651238
 [6] ILMN_1651254 ILMN_1651259 ILMN_1651260 ILMN_1651262 ILMN_1651278
 [11] ILMN_1651282 ILMN_1651285 ILMN_1651286 ILMN_1651303 ILMN_1651310
 [16] ILMN_1651315 ILMN_1651330 ILMN_1651336 ILMN_1651343 ILMN_1651346
 [21] ILMN_1651347 ILMN_1651354 ILMN_1651358 ILMN_1651370 ILMN_1651373
 [26] ILMN_1651385 ILMN_1651396 ILMN_1651415 ILMN_1651428 ILMN_1651430
 [31] ILMN_1651433 ILMN_1651437 ILMN_1651438 ILMN_1651456 ILMN_1651457

【问题讨论】:

  • 代码无法运行。 xx2 是什么?

标签: r loops merge dataframe


【解决方案1】:

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

> 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

您可以通过使用 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

并通过 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

【讨论】:

  • @Samantha 我放了一段代码,cbinds 是一个列表。可能最好显示输入(即数据)和期望输出的示例,以明确您的问题是什么。
  • 你的第一个输出 zz 是对的,但是代码在循环中,所以我的想法是没有办法在循环中使用这段代码。 (zz
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 2022-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多