我想在lapply函数中创建一个包含对象名称的列,作为代理我称之为name.of.x.as.strig.function(),遗憾的是我不知道该怎么做,也许是assign,do.call和paste的组合。但到目前为止使用这个功能只会让我陷入更深层次的麻烦,我很确定会有更像R的解决方案。
# generates a list of dataframes,
data <- list(data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)))
# assigns names to dataframe
names(data) <- list("one","two", "tree", "four")
# subsets the second column into the object data.anova
data.anova <- lapply(data, function(x){x <- x[[2]];
return(matrix(x))})
这应该允许我在数据框内创建一个包含其名称的列,用于列表中的所有矩阵
data.anova <- lapply(data, function(x){
x$id <- name.of.x.as.strig.function(x)
return(x)})
我想检索:
3 one
3 one
3 two
3 two
...
非常感谢任何输入。
搜索历史:将对象名称检索为字符串的函数,R获取lapply内的对象名称...
答案 0 :(得分:3)
您是否只是在寻找stack
?
stack(lapply(data, `[[`, 2))
# values ind
# 1 3 one
# 2 3 one
# 3 3 two
# 4 3 two
# 5 3 tree
# 6 3 tree
# 7 3 four
# 8 3 four
(或者,使用您原来的方法:stack(lapply(data, function(x) {x <- x[[2]]; x}))
)
如果是这种情况,来自“reshape2”的melt
也可以。
答案 1 :(得分:1)
循环遍历data.anova
的索引,并使用它来获取数据和名称:
data.anova <- lapply(seq_along(data.anova), function(i){
x <- as.data.frame(data.anova[[i]])
x$id <- names(data.anova)[i]
return(x)})
这会产生:
# [[1]]
# V1 id
# 1 3 one
# 2 3 one
# [[2]]
# V1 id
# 1 3 two
# 2 3 two
# [[3]]
# V1 id
# 1 3 tree
# 2 3 tree
# [[4]]
# V1 id
# 1 3 four
# 2 3 four