在R中合并超过2个数据框时,同时分配一个标识因子。

3

拿这个非常简单的RWE,我想知道可以使用哪个包在将两个或多个数据框合并时自动分配因子(最好是数据框名称)

像下面的例子中手动定义了因子并显示了期望的输出。但是我想要自动化它,因为我有100多个表需要合并。请注意,每个df内的标题都是不变的,只有名称本身会更改

A <- 1:5
B <- 5:1

df1 <- data.frame(A,B)

A <- 2:6
B <- 6:2

df2 <- data.frame(A,B)

df1$ID <- rep("df1", 5)
df2$ID <- rep("df2", 5)

big_df <- rbind(df1,df2)
3个回答

1

请考虑以下内容:

library(dplyr)
cof_df <- bind_rows(df1, df2, .id="ID")
cof_df
   ID A B
1   1 1 5
2   1 2 4
3   1 3 3
4   1 4 2
5   1 5 1
6   2 2 6
7   2 3 5
8   2 4 4
9   2 5 3
10  2 6 2

然后:

cof_df$ID <- factor(cof_df$ID, 
                    levels = c(1,2),
                    labels = paste0("df", unique(cof_df$ID)))

进行重新编码。

通过在bind_rows中命名参数,可以获得类似的结果,如下所示:

cof_df <- bind_rows(df1=df1, df2=df2, .id="ID")

1
假设你的数据框名称遵循一定的模式,如以“df”开头后跟数字,并且它们不在列表中,而只是在全局环境中,你可以使用以下方法:
library(data.table)
bigdf <- rbindlist(Filter(is.data.frame, mget(ls(pattern = "^df\\d+"))), id = "ID")

没有data.table,你可以按照以下方式进行:

lst <- Filter(is.data.frame, mget(ls(pattern = "^df\\d+")))
bigdf <- do.call(rbind, Map(function(df, id) transform(df, ID=id), lst, names(lst)))

太棒了,我知道一定有一个简单的方法。非常感谢。 - lukeg

0
另一个解决方案是使用合并功能:
merged <- merge(df1, df2, all=TRUE, sort =FALSE)

> merged
   A B  ID
1  1 5 df1
2  2 4 df1
3  3 3 df1
4  4 2 df1
5  5 1 df1
6  2 6 df2
7  3 5 df2
8  4 4 df2
9  5 3 df2
10 6 2 df2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接