为列中的所有行分配数据框名称

Haakonkas

我想为列表中的每个数据框将数据框名称添加到列中的所有行。

虚拟数据:

test_df <- data.frame(x = 1:5, y = c("a","b","c","d","e"))

我要结束的是:

x    y    ref
1    a    test_df
2    b    test_df
3    c    test_df
4    d    test_df
5    e    test_df

原因是我稍后将重新绑定多个数据帧,并且希望能够过滤值来自哪个数据帧。我尝试了以下方法:

library(dplyr)

test <- function(df) {
  df <- df %>%
    mutate(ref = deparse(substitute(df)))
  return(df)
}

但这只会在每行中创建一个名为ref的列,其值为“ df”。与dplyr的任何建议将不胜感激。还是有办法直接在rbind-call中创建此列?

咖啡因垃圾

使用dplyr,请尝试以下操作:

library(lazyeval)
test <- function(df) {
   df <- df %>% mutate(ref = expr_label(df))
   return(df)
 }
test(test_df)
  x y       ref
1 a `test_df`
2 b `test_df`
3 c `test_df`
4 d `test_df`
5 e `test_df`

另外,这也可以,但是不使用dplyr

test2 <- function(df) {
  df$ref <- deparse(substitute(df))
  return(df)
}
test2(test_df)
  x y     ref
1 1 a test_df
2 2 b test_df
3 3 c test_df
4 4 d test_df
5 5 e test_df

要使它与数据帧列表一起使用,lapply由于lapply工作原理而比较棘手,但是以下变通方法起作用:

test_df <- data.frame(x = 1:5, y = c("a","b","c","d","e"))
test_df2 <- data.frame(x = 11:15, y = c("aa","bb","cc","dd","ee"))

在这里,我创建一个数据框的命名列表:

dfs <- setNames(list(test_df, test_df2), c("test_df", "test_df2"))
dfs
$test_df
  x y
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e

$test_df2
   x  y
1 11 aa
2 12 bb
3 13 cc
4 14 dd
5 15 ee

现在,我更改辅助函数以将该名称作为参数:

test3 <- function(df, nm) {
  df$ref <- nm
  return(df)
}

在这里,我仅将名称传递给我,lapply并从dfs上面定义的命名列表检索每个数据框

lapply(names(dfs), function(x) test3(dfs[[x]], x))
[[1]]
  x y     ref
1 1 a test_df
2 2 b test_df
3 3 c test_df
4 4 d test_df
5 5 e test_df

[[2]]
   x  y      ref
1 11 aa test_df2
2 12 bb test_df2
3 13 cc test_df2
4 14 dd test_df2
5 15 ee test_df2

那不是最优雅的方式,但是它可行。

话虽如此,如果您想将数据帧组合为一个单一的数据帧,@markus的using推荐就没有什么可添加的了bind_rows,例如

bind_rows(dfs, .id="ref")
        ref  x  y
1   test_df  1  a
2   test_df  2  b
3   test_df  3  c
4   test_df  4  d
5   test_df  5  e
6  test_df2 11 aa
7  test_df2 12 bb
8  test_df2 13 cc
9  test_df2 14 dd
10 test_df2 15 ee

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R:在将列元素分配为现有数据框中的行名称时处理非唯一行名称

如果列行中的值为零,则删除pandas数据框中所有列中的所有行

匹配数据框中的所有出现

Python / Pandas-从数据框中删除所有列,其中> 50%的行的值为0

如何从数据框中删除所有列值为零或布尔值false的行

从 Pandas 数据框中删除总和为零的所有列和行的最佳方法

如何从列范围之和为0的数据框中删除所有行?

为数据框中的所有列绘制直方图

从所有值为NA的数据框中删除列

熊猫:为多索引数据框的所有行分配一个列表

为空数据框的列分配名称和类型

如何在熊猫数据框中为索引和列的“交集”分配名称?

匹配数据框中列的文本

匹配数据框中的两列

如何在列表元素之间分配数据框的行

如何在新列中为R数据框中的特定行分配类别?

R:分配数据框列的变量标签

如何根据列名分配数据框列类?

如何保留数据框中所有列中具有相同值的所有行?

匹配数据框中所有列的字符串,并估算或替换值

根据产品说明和另一个键为数据框中的所有相似产品/行分配一个键

通过匹配数据框y中的第1列并插入第3列来重命名矩阵x的行名/名称

为数据框中的列行值分配预定义的数字

将列中的特定行与数据框中该特定行的所有列进行比较

合并数据框中的所有列

通过两列中的值范围匹配数据框中的行

根据熊猫数据框中的条件为列分配值

在两个数据框的列相等的情况下,分配数据框的列值

删除其中一列中带有“ $-”的数据框中的所有行