r - 用一个区分列连接两个数据帧的单行器?

我经常发现自己创建了两个相似的数据框,我想将它们 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

相似文章

typescript - 从数组返回子树

我有一个区域数组,最高区域有key:10和parent_id:null,我想重组这个数组以返回一棵树。如果输入是[10],区域树应该看起来像埃及1区Tagamo3GizaHelwanFayoum2区G...

video - 与 ffmpeg 不一致的帧号

我经常遇到hvc1videos在ffprobe信息和FFmpeg信息之间获得不一致的帧数的问题,我想知道这个问题的原因是什么,以及如何在不重新解决的情况下解决它-编码video。我用我的测试video...

最新文章