【发布时间】:2020-05-29 14:23:53
【问题描述】:
我想结合使用一个小函数和 lapply() 来给数据框打标签
我有以下代码:
df1 <- data.frame(c(1,2,3), c(3,4,5))
df2 <- data.frame(c(6,7,8), c(9,10,11))
f.generate.name <- function(x) {
x$name <- deparse(substitute(x))
return(x)
}
my_list <- list(df1, df2)
# This works fine.
f.generate.name(df1)
# This does not work.
lapply(my_list, f.generate.name)
产生以下输出
[[1]]
c.1..2..3. c.3..4..5. name
1 1 3 X[[i]]
2 2 4 X[[i]]
3 3 5 X[[i]]
[[2]]
c.6..7..8. c.9..10..11. name
1 6 9 X[[i]]
2 7 10 X[[i]]
3 8 11 X[[i]]
我想要的是:
[[1]]
c.1..2..3. c.3..4..5. name
1 1 3 df1
2 2 4 df1
3 3 5 df1
[[2]]
c.6..7..8. c.9..10..11. name
1 6 9 df2
2 7 10 df2
3 8 11 df2
不使用循环的最好方法是什么?如何调整 lapply() 函数或我创建的函数以达到预期的结果?
【问题讨论】:
-
问题是您使用
df1和df2的副本 创建my_list,而my_list中的那些副本不称为df1和df2。那么df1和df2的名称从哪里来?如果您使用my_list <- list(df1 = df1, df2 = df2),这将很容易做到,但是对于未命名的列表,您要求提取的名称在您传递的对象中不存在。 -
@AllanCameron 够公平的。但是,更改为
my_list <- list(df1 = df1, df2 = df2)会产生相同的输出。 -
当然可以,但还有其他方法,例如
lapply(names(my_list), function(x) {my_list[[x]]$name <- x; my_list[[x]];}) -
您发现任何建议的解决方案有帮助吗?如果是这样,请将它们标记为已接受,以表示社区知道它。否则,请解释缺少的内容。谢谢
标签: r lapply substitution