r - 合并数据框并将列合并为一

标签 r

我有以下三个数据框:

df1 <- data.frame(name=c("John", "Anne", "Christine", "Andy"),
                  age=c(31, 26, 54, 48),
                  height=c(180, 175, 160, 168),
                  group=c("Student",3,5,"Employer"), stringsAsFactors=FALSE)

df2 <- data.frame(name=c("Anne", "Christine"),
                  age=c(26, 54),
                  height=c(175, 160),
                  group=c(3,5),
                  group2=c("Teacher",6), stringsAsFactors=FALSE)

df2 <- data.frame(name=c("Christine"),
                  age=c(54),
                  height=c(160),
                  group=c(5),
                  group2=c(6),
                  group3=c("Scientist"), stringsAsFactors=FALSE)

我想将它们结合起来,以便得到以下结果:
df.all <- data.frame(name=c("John", "Anne", "Christine", "Andy"),
                     age=c(31, 26, 54, 48),
                     height=c(180, 175, 160, 168),
                     group=c("Student", "Teacher", "Scientist", "Employer"))

目前我是这样做的:
df.all <- merge(merge(df1[,c(1,4)], df2[,c(1,5)], all=TRUE, by="name"),
                df3[,c(1,6)], all=TRUE, by="name")
row.ind <- which(df.all$group %in% c(6,5))
df.all[row.ind, c("group")] <- df.all[row.ind, c("group2")]
row.ind2 <- which(df.all$group2 %in% c(6))
df.all[row.ind2, c("group")] <- df.all[row.ind2, c("group3")]

这不是一概而论的,而且真的很困惑。也许会有一种方法可以使用 merge_allmerge_recurse对于合并步骤(特别是因为可能要合并两个以上的数据帧),但我还没有弄清楚如何。这两个不会产生正确的结果:
df.all <- merge_all(list(df1, df2, df3))
df.all <- merge_recurse(list(df1, df2, df3), by=c("name"))

有没有更通用和优雅的方法来解决这个问题?

最佳答案

这是另一种可能的方法,如果我明白你最终想要的是什么。 (不清楚“组”列中的数值是什么,所以我不确定这正是您要找的。)

使用 Reduce()合并您的多个 data.frame s。

temp <- Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3))
names(temp)[4] <- "group1" # Rename "group" to "group1" for reshaping 
temp
#        name age height   group1  group2    group3
# 1      Andy  48    168 Employer    <NA>      <NA>
# 2      Anne  26    175        3 Teacher      <NA>
# 3 Christine  54    160        5       6 Scientist
# 4      John  31    180  Student    <NA>      <NA>

使用 reshape()从宽到长 reshape 您的数据。
df.all <- reshape(temp, direction = "long", idvar="name", varying=4:6, sep="")
df.all
#                  name age height time     group
# Andy.1           Andy  48    168    1  Employer
# Anne.1           Anne  26    175    1         3
# Christine.1 Christine  54    160    1         5
# John.1           John  31    180    1   Student
# Andy.2           Andy  48    168    2      <NA>
# Anne.2           Anne  26    175    2   Teacher
# Christine.2 Christine  54    160    2         6
# John.2           John  31    180    2      <NA>
# Andy.3           Andy  48    168    3      <NA>
# Anne.3           Anne  26    175    3      <NA>
# Christine.3 Christine  54    160    3 Scientist
# John.3           John  31    180    3      <NA>

利用 as.numeric() 的事实将字符强制为 NA ,并使用 na.omit()删除所有行 NA值。
na.omit(df.all[is.na(as.numeric(df.all$group)), ])
#                  name age height time     group
# Andy.1           Andy  48    168    1  Employer
# John.1           John  31    180    1   Student
# Anne.2           Anne  26    175    2   Teacher
# Christine.3 Christine  54    160    3 Scientist

同样,这可能会过度概括您的问题——例如,其他列中可能有 NA 值——但它可能有助于指导您解决问题。

关于r - 合并数据框并将列合并为一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881046/

相关文章:

r - RStudio在保存之前将R临时脚本文件存储在哪里?

R t 检验分组因子必须恰好有 2 级误差

r - KableExtra - 折叠行对齐

r - 如何从文件夹中删除与 R 中 df 列中的名称不匹配的某些文件

python - R数据框的首选数据格式

database - 加快 sqlFetch()

r - 安装的目录不可写,无法更新软件包 'boot', 'class', 'KernSmooth', 'mgcv', 'nnet', 'rpart', 'spatial'

r - 如何在 dplyr 中使用参数化 SQL?

R:检查 df 行中的任何值是否不存在于其他 df 的同一行中

r - 在循环中使用多个 geom_segment 丰富 ggplot2 图?