提问人:Reda 提问时间:10/10/2023 最后编辑:jpsmithReda 更新时间:10/11/2023 访问量:60
如何根据 r 中特定数据的列合并数据
How to merge data based on column of specific data in r
问:
我有三个数据,每个数据都包含一列和相同的行,但在所有五个数据中以不同的顺序,我想根据第一列合并五个数据。
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
答:
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.call
setNames
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这是包中的一个函数。应由 自动加载。您的代码是否在没有最后一个代码的情况下运行?tibble
tidyverse
%>%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)
评论