我经常发现自己创建了两个相似的数据框,我想将它们 rbind
放在一起,但要跟踪每一行来自哪一个,并带有一个区别列。我的典型主题是
new_df <- rbind(
cbind(df1, id="A"),
cbind(df2, id="B")
)
为了便于阅读,它很好地折叠成一行,但感觉很笨拙,我想做得更优雅。我宁愿避免在多行上为每个单独定义新列,如下所示:
df1$id <- "A"
df2$id <- "B"
new_df <- rbind(df1, df2)
虽然我知道你可以通过使用 $<-
来使它成为一个单行,这往往使它比上面的 cbind/rbind 主题更不可读。这些行也不能保证是唯一的,所以我不能做我在其他地方看到的经典 mutate/ifelse 主题:
# 'value' is not necessarily unique in the below line
new_df <- cbind(df1, df2) %>% mutate(id = ifelse(something==value, "A", "B")
该问题通常受到诸如为 ggplot
添加构面变量之类的过程的启发-我已经从不同的过程中制作了两个数据框,但想使用需要构面列的构面来绘制它们。
rbind
两个数据帧同时创建一个跟踪它们来自哪个数据帧的列的 R 友好方式是什么?
回答1
bind_rows
可能更容易
library(dplyr)
bind_rows(list(A = df1, B = df2), .id = 'id')
回答2
1) 我们可以像这样使用 base R 中的 rbind/Map 。这可以处理任意数量的数据帧,尽管这里我们只展示了两个。
do.call("rbind", Map(data.frame, id = c("A", "B"), list(BOD, 10 * BOD)))
2) 如果我们从命名列表 L 开始,那么基本 R 代码将如下所示。
L <- list(A = BOD, B = 10 * BOD)
do.call("rbind", Map(data.frame, id = names(L), L))
给予:
id Time demand
A.1 A 1 8.3
A.2 A 2 10.3
A.3 A 3 19.0
A.4 A 4 16.0
A.5 A 5 15.6
A.6 A 7 19.8
B.1 B 10 83.0
B.2 B 20 103.0
B.3 B 30 190.0
B.4 B 40 160.0
B.5 B 50 156.0
B.6 B 70 198.0
3) 请注意,如果包含如图所示的名称,则只有一个普通的 rbind 将使用其来源的唯一标识指示标记行。
rbind(A = BOD, B = 10 * BOD)
给予:
Time demand
A.1 1 8.3
A.2 2 10.3
A.3 3 19.0
A.4 4 16.0
A.5 5 15.6
A.6 7 19.8
B.1 10 83.0
B.2 20 103.0
B.3 30 190.0
B.4 40 160.0
B.5 50 156.0
B.6 70 198.0