我有几个数据帧要按行组合.在生成的单个数据框中,我想创建一个新变量,标识观察来自哪个数据集.

# original data frames
df1 <- data.frame(x = c(1, 3), y = c(2, 4))
df2 <- data.frame(x = c(5, 7), y = c(6, 8))

# desired, combined data frame
df3  <- data.frame(x = c(1, 3, 5, 7), y = c(2, 4, 6, 8),
                   source = c("df1", "df1", "df2", "df2")
# x y source
# 1 2    df1
# 3 4    df1
# 5 6    df2
# 7 8    df2

我怎样才能做到这一点?

推荐答案

这不完全是你想要的,但非常接近.将你的对象放入一个命名列表,并使用do.call(rbind...)

> do.call(rbind, list(df1 = df1, df2 = df2))
      x y
df1.1 1 2
df1.2 3 4
df2.1 5 6
df2.2 7 8

请注意,行名称现在反映了源data.frame.

Update: Use cbind and rbind

另一个选项是创建如下基本函数:

AppendMe <- function(dfNames) {
  do.call(rbind, lapply(dfNames, function(x) {
    cbind(get(x), source = x)
  }))
}

然后,该函数获取要"叠加"的data.frame个名称的字符向量,如下所示:

> AppendMe(c("df1", "df2"))
  x y source
1 1 2    df1
2 3 4    df1
3 5 6    df2
4 7 8    df2

Update 2: Use combine from the "gdata" package

> library(gdata)
> combine(df1, df2)
  x y source
1 1 2    df1
2 3 4    df1
3 5 6    df2
4 7 8    df2

Update 3: Use rbindlist from "data.table"

现在可以使用的另一种方法是使用"data.table"中的rbindlist及其idcol参数.有鉴于此,方法可以是:

> rbindlist(mget(ls(pattern = "df\\d+")), idcol = TRUE)
   .id x y
1: df1 1 2
2: df1 3 4
3: df2 5 6
4: df2 7 8

Update 4: use map_df from "purrr"

rbindlist类似,您还可以使用"purrr"中的map_dfIc作为应用于每个列表元素的函数.

> mget(ls(pattern = "df\\d+")) %>% map_df(I, .id = "src")
Source: local data frame [4 x 3]

    src     x     y
  (chr) (int) (int)
1   df1     1     2
2   df1     3     4
3   df2     5     6
4   df2     7     8

R相关问答推荐

从R中的另一个包扩展S3类的正确方法是什么

无法在我的情节中表现出显着的差异

在边界外添加注释或标题

检测(并替换)字符串中的数学符号

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

如何根据条件计算时差(天)

将数据集中的值增加到当前包含的最大值

bslib::card_header中的shine::downloadButton,图标而不是文本

如何直接从R中的风险分数计算c指数?

如何自定义3D散点图的图例顺序?

如何将R中数据帧中的任何Nas替换为最后4个值

以相同的方式对每个表进行排序

解析R函数中的变量时出现的问题

从多层嵌套列表构建Tibble?

防止在更新SHINY中的Reactive Value的部分内容时触发依赖事件

创建在文本字符串中发现两个不同关键字的实例的数据框

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

了解nchar在列表上的意外行为

Ggplot2:添加更多特定 colored颜色 的线条

R data.设置函数&;连接中的列值而不使用for循环的表方法?