r创建一个包含lapply函数内的对象名称的列

时间:2014-02-11 18:28:41

标签: r lapply

我想在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内的对象名称...

2 个答案:

答案 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