【问题标题】:do.call("rbind", list(data, frames)) but also index each row by its original data frame [duplicate]do.call("rbind", list(data, frames)) 还按其原始数据框索引每一行[重复]
【发布时间】:2015-01-14 23:42:54
【问题描述】:
df1 <- data.frame(a = 1:2, b = 3:4)
df2 <- data.frame(a = 5:6, b = 7:8)

# A common method loses the origin of each row.
do.call("rbind", list(df1, df2))
##   a b
## 1 1 3
## 2 2 4
## 3 5 7
## 4 6 8

# Whereas here, X1 records which data frame each row originated in.
library(plyr)
adply(list(df1, df2), 1)
##   X1 a b
## 1  1 1 3
## 2  1 2 4
## 3  2 5 7
## 4  2 6 8

有没有其他方法可以做到这一点,也许更有效?

【问题讨论】:

  • 我不知道是否更有效率,但如果l &lt;- list(df1, df2) 是您的列表,您可能会使用Map 创建索引,例如l &lt;- Map(cbind, l, indx = seq_len(length(l)))
  • reshape2::melt(list(df1,df2),1:2) 是另一种选择
  • 有没有办法使这个问题合法化,以便获得与其他问题大不相同的答案?
  • @nacnudus - 这是合法的!它仍然会留在这里,只是现在与另一个问题相关联,以便找到一个问题的人可以找到另一个问题。

标签: r dplyr


【解决方案1】:

这是一种方法。

library(dplyr)
library(tidyr)

foo <- list(df1, df2)

unnest(foo, names) %>%
mutate(names = gsub("^X", "", names))

#  names a b
#1     1 1 3
#2     1 2 4
#3     2 5 7
#4     2 6 8

【讨论】:

  • 嗯,names?那是什么魔法?
  • @DavidArenburg 我正在寻找一种将 data.frame 名称添加到绑定 data.frame 的方法。然后,我不久前在一个 SO 答案中发现了unnest 的这种用法。列名不必是names。例如,它可以是david。
  • 这很漂亮。您甚至可以将其保留为 unnest(foo, names)
  • @RichardScriven 是的,你是对的。我只是想实现预期的结果。 mutate 部分 cab 是可选的。
  • 确实很漂亮。也许值得添加到data.table::rbindlist
【解决方案2】:

带底座:

df1 <- data.frame(a = 1:2, b = 3:4)
df2 <- data.frame(a = 5:6, b = 7:8)

frames <- list(df1, df2)

do.call(rbind, lapply(seq_along(frames), function(x) {
  frames[[x]]$X1 <- x
  frames[[x]]
}))

##   a b X1
## 1 1 3  1
## 2 2 4  1
## 3 5 7  2
## 4 6 8  2

顺便说一句,如果您想了解plyr 是如何做到这一点的,请访问(plyr::adply)、(plyr:::splitter_a) 和(plyr::ldply)。与此相比,这些答案微不足道:-)

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2016-09-24
    • 2016-08-29
    • 2017-05-02
    • 2020-11-20
    • 2019-09-06
    • 2023-02-13
    • 2018-06-30
    相关资源
    最近更新 更多