【问题标题】:Merging multiple tables in R [duplicate]在R中合并多个表[重复]
【发布时间】:2016-11-28 19:51:32
【问题描述】:

编辑:我了解合并多个数据框的问题之前已被问过,但我被困在如何合并多个表而不首先转换为数据框,更简洁。如果您想了解如何合并多个数据框,请查看出色的答案here(也在下面链接)。

所以我已经有一种方法可以在 R 中合并多个数据帧,但我希望有人可以帮助我找到一种更优雅的方法。这是我拥有的代码示例。鉴于 df1、df2 和 df3 是具有相同列(包括列名“类”)但行数不同的数据帧,我可以这样做:

table1 <- table(df1$class)
table2 <- table(df2$class)
table3 <- table(df3$class)

按照this 的回答,我可以合并它们:

merged.table <- Reduce(function(...) merge(..., all=T), list(table1, table2, table3))

我的问题是合并不正确,因为对象 table1、table2 和 table3 具有相同的标识名称,merged.table 最终将数据合并到一列。

我的解决方法是将表格转换为数据框,如下所示:

table1 <- as.data.frame(table(df1$class))
colnames(table1) <- c("ID","counts1")
table2 <- as.data.frame(table(df2$class))
colnames(table2) <- c("ID","counts2")
table3 <- as.data.frame(table(df3$class))
colnames(table3) <- c("ID","counts3")

然后合并工作正常。但是让我告诉你,一段时间后这会变得非常笨重和乏味,我需要经常做这种事情。

有没有什么方法可以在不将表格转换为数据框并分配列名的情况下实现相同的目标?

以下是数据框的示例,为简单起见已截断:

transcript <- rep(c("a","b","c","d","e","f"))
family <- rep(c("L1","L2","ERV"),2)
class <- rep(c("LINE","LINE","LTR"),2)

df1 <- data.frame(transcript, family, class)

transcript  family  class
a            L1     LINE
b            L2     LINE
c            ERV    LTR
d            L1     LINE
e            L2     LINE
f            ERV    LTR

【问题讨论】:

  • 太棒了! by="Var1" 技巧效果很好。你能把它作为答案留下来让我接受吗?

标签: r merge


【解决方案1】:

我们需要在合并中添加by = "Var1" 参数:

# dummy data
transcript <- rep(c("a","b","c","d","e","f"))
family <- rep(c("L1","L2","ERV"),2)
class <- rep(c("LINE","LINE","LTR"),2)
df1 <- data.frame(transcript, family, class)

# get table as data.frame
table1 <- as.data.frame(table(df1$class))
table2 <- as.data.frame(table(df1$class))
table3 <- as.data.frame(table(df1$class))

# merge without by
Reduce(function(...) merge(..., all = TRUE),
       list(table1, table2, table3))
#   Var1 Freq
# 1 LINE    4
# 2  LTR    2

# merge with by = "Var1"
Reduce(function(...) merge(..., all = TRUE, by = "Var1"),
       list(table1, table2, table3))

#   Var1 Freq.x Freq.y Freq
# 1 LINE      4      4    4
# 2  LTR      2      2    2

【讨论】:

  • by 声明也存在于欺骗本身中......在我看来,只是没有仔细阅读答案
  • @DavidArenburg 哎呀,让我们把它当作骗子关闭吧。
猜你喜欢
  • 2019-07-02
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2019-03-04
  • 2017-12-20
  • 2012-06-13
相关资源
最近更新 更多