使用purrr包中的lapply()或map()来提取列表元素的名称

时间:2017-04-18 20:49:49

标签: r lapply purrr

我正在尝试使用lapply中的mappurrr来检索列表中的名称,作为我正在构建的更大函数的一部分,但我不断得到意想不到的结果。例如:

MyList=list(x=1:5, y=6:10)

> MyList
$x
[1] 1 2 3 4 5

$y
[1]  6  7  8  9 10

names(MyList)
[1] "x" "y"
### seems OK

map(MyList,names)
$x
NULL

$y
NULL

map_chr(MyList,names)
Error: Result 1 is not a length 1 atomic vector

lapply()提供与map()相同的结果。我得到的对象是list,其元素具有我想要的名称,但每个元素的内容都是NULL。我想提取名称本身,无论是作为列表中的元素还是作为字符向量。为什么会这样?我应该怎样做到这一点?

1 个答案:

答案 0 :(得分:3)

不幸的是,无法使用maplapply获取元素名称。当我在maplapply中使用自定义函数时,需要元素名称I {1} map覆盖m个元素名称的向量,然后从中提取数据列表使用它。这是一个例子:

library(dplyr) 
library(purrr)

MyList = list(Normal = rnorm(1000), 
              Gamma = rgamma(1000, shape = 4), 
              Weibull = rweibull(1000, shape = 1))

ListNames <- names(MyList)

ListNames %>% 
  walk(function(x) { # walk is another version of map
    data <- MyList[[x]]
    cat("\nMean of ", x, "is ", mean(data))
    cat("\nMedian of ", x, "is ", median(data))
  })

给出了:

Mean of  Normal is  0.03043051
Median of  Normal is  0.01864171
Mean of  Gamma is  3.884722
Median of  Gamma is  3.500294
Mean of  Weibull is  0.9854814
Median of  Weibull is  0.6707907