如何根据 r 中特定数据的列合并数据

How to merge data based on column of specific data in r

提问人:Reda 提问时间:10/10/2023 最后编辑:jpsmithReda 更新时间:10/11/2023 访问量:60

问:

我有三个数据,每个数据都包含一列和相同的行,但在所有五个数据中以不同的顺序,我想根据第一列合并五个数据。

      column1
X       7
B        5
Y        2
D        1
Z        0


        column2
D          7 
Z          5
X          2
Y          6
B          7

       column3
Y          4
D          4
Z          8 
B          7
X          2

我想要的结果是这样的

        column1     column2      column3
X           7          2            2
B           5          7            7
Y           2          6            4
D           1          7            4
Z           0          5            8
R DataFrame 合并 多列统计 信息

评论

0赞 jpsmith 10/10/2023
这回答了你的问题吗?按列名合并 3 个 data.frames - 当然,请编辑您的问题以包括为什么链接中提供的解决方案不起作用
0赞 Reda 10/10/2023
没有 id 不起作用,它提供 64000000 行!!!!

答:

0赞 Lloyd_LiuSiyi 10/10/2023 #1

这可以通过该功能轻松完成。merge

df1 <- data.frame(rows = c("A", "B", "C", "D", "E"), column1 = c(7, 5, 2, 1, 0))
df2 <- data.frame(rows = c("D", "E", "A", "C", "B"), column2 = c(7, 5, 2, 6, 7))
df3 <- data.frame(rows = c("C", "D", "E", "B", "A"), column3 = c(4, 4, 8, 7, 2))
result <- merge(df1, df2, by = "rows", all = TRUE)
result <- merge(result, df3, by = "rows", all = TRUE)
print(result)

这应该提供你想要的。

rows column1 column2 column3
1    A       7       2       2
2    B       5       7       7
3    C       2       6       4
4    D       1       7       4
5    E       0       5       8

评论

0赞 Reda 10/10/2023
您好,感谢您的回答,问题是我的行名中没有“行”,我编辑了我的问题。
0赞 Lloyd_LiuSiyi 10/11/2023
@Reda 所以你的数据帧只包含 1 列,而 ABCDE 只是行索引?如果是这样,我建议用参数编写数据帧,再次将它们读入 R,我的答案将起作用。row.names=T
0赞 jpsmith 10/10/2023 #2

在 base R 中,可以使用以下方法:

df_list <- list(df1, df2, df3)

Reduce(merge, lapply(df_list, \(x) 
  cbind(x, xx = row.names(x)))) |> _[-1]

#   column1 column2 column3
# 1       7       2       2
# 2       5       7       7
# 3       2       6       4
# 4       1       7       4
# 5       0       5       8

另一种方法是按行名重新排序,然后将它们放在一起。将它们组合到一个列表中,然后使用将所有内容重新组合在一起时,执行此操作会更容易。我还将其包装起来,以将列重命名为所需的列名:do.callsetNames

df_list <- list(df1, df2, df3)

setNames(do.call(data.frame, lapply(df_list, \(x) x[order(rownames(x)),])), 
         paste0("column", 1:3))

#   column1 column2 column3
# 1       7       2       2
# 2       5       7       7
# 3       2       6       4
# 4       1       7       4
# 5       0       5       8

以上与手动执行相同,速度较慢,但可能更容易解释正在发生的事情:

df1 <- df1[order(rownames(df1)),]
df2 <- df2[order(rownames(df2)),]
df3 <- df3[order(rownames(df3)),]

data.frame(column1 = df1, column2 = df2, column3 = df3)

#   column1 column2 column3
# 1       7       2       2
# 2       5       7       7
# 3       2       6       4
# 4       1       7       4
# 5       0       5       8

数据:

df1 <- read.table(text = "column1
A        7
B        5
C        2
D        1
E        0", h = TRUE)


df2 <- read.table(text = "column2
D          7 
E          5
A          2
C          6
B          7", h = TRUE)

df3 <- read.table(text = "column3
C          4
D          4
E          8 
B          7
A          2", h = TRUE)

评论

0赞 Reda 10/10/2023
谢谢你的回答,但顺序不起作用,因为事实上我想保持与我的第一个数据相同的顺序,我没有使用你的答案得到(行名是这样的代码 XFR44 YZZ888......
0赞 jpsmith 10/10/2023
感谢 Reda,由于这不适用于示例数据,因此您可能需要编辑问题中的示例数据以更好地反映您的情况。
0赞 jpsmith 10/11/2023
我的编辑@Reda帮助?查看(新)第一种方法
0赞 Reda 10/11/2023
第一个解决方案中的语法有问题:错误:意外输入:“Reduce(merge, lapply(df_list, (x) cbind(x, xx = row.names(x)))) |> _”
0赞 jpsmith 10/11/2023
@Reda 这可能与您的数据有关 - 这适用于示例数据。如果您编辑问题以包括 、 等,那么我们就可以获得您数据的确切结构,看起来您可能会更好。dput(df1)dput(df2)
1赞 Onyambu 10/10/2023 #3

用:tidyverse

library(tidyverse)

list(df1, df2, df3)%>%
   map(rownames_to_column) %>%
   reduce(full_join, 'rowname') %>%
   column_to_rownames()

  column1 column2 column3
A       7       2       2
B       5       7       7
C       2       6       4
D       1       7       4
E       0       5       8

评论

0赞 Reda 10/10/2023
我们column_to_rownames什么??
0赞 Onyambu 10/11/2023
@Reda它就像一个函数,就像任何其他功能一样。运行代码,看看你得到了什么
0赞 Reda 10/11/2023
因为我有这个错误消息:column_to_rownames(.) 中的错误:找不到函数“column_to_rownames”
0赞 Onyambu 10/11/2023
@Reda这是包中的一个函数。应由 自动加载。您的代码是否在没有最后一个代码的情况下运行?tibbletidyverse%>%columns_to_rownames()
0赞 Reda 10/11/2023
不,我也得到了这个错误: h(simpleError(msg, call)) 中的错误: erreur d'ï¿1/2valuation de l'argument 'x' lors de la sï¿1/2lection d'une mï¿1/2thode pour la fonction 'reduce' : unused argument (rownames_to_column)