gpt4 book ai didi

r - 将数据框名称分配给列中的所有行

转载 作者:行者123 更新时间:2023-12-01 12:13:19 24 4
gpt4 key购买 nike

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

虚拟数据:

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

原因是我稍后将 rbind 多个数据帧,并且我希望能够过滤值来自哪个数据帧。我尝试了以下方法:
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 使用 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

关于r - 将数据框名称分配给列中的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50199703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com