合并 2 个以上的数据帧,同时在 R 中分配一个标识符因子
merging more than 2 data frames whilst assigning an identifier factor in R
拿这个非常简单的RWE来说,我想知道当我们合并两个或多个时,可以使用什么包来自动分配一个因子(最好是数据框名称)data.frames
我在下面的示例中手动定义了因子并显示了所需的输出。但我想自动化它,因为我有超过 100 个表要合并。请注意,每个 df 中的 headers 是不变的,只有名称本身会发生变化
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)
考虑以下几点:
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")
假设您的 data.frame 名称遵循某种模式,例如以 "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)))
另一个解决方案是使用合并:
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
拿这个非常简单的RWE来说,我想知道当我们合并两个或多个时,可以使用什么包来自动分配一个因子(最好是数据框名称)data.frames
我在下面的示例中手动定义了因子并显示了所需的输出。但我想自动化它,因为我有超过 100 个表要合并。请注意,每个 df 中的 headers 是不变的,只有名称本身会发生变化
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)
考虑以下几点:
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")
假设您的 data.frame 名称遵循某种模式,例如以 "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)))
另一个解决方案是使用合并:
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