在R中使用列表:对循环说不?

在R中使用列表:对循环说不?,r,list,R,List,我想找到一种更好的方法,根据R中的逻辑函数将列表折叠成数据帧。下面是一个可复制的示例,说明了对我有效的方法: a <- data.frame(foo = c(1:3), bar = c(letters[1:3])) bazL <- list(c("a", "z", "g"), NULL, "c") a$baz <- NULL for(i in 1:length(a$foo)) { a$baz[i] <- (bazL[[i]] > 0)[1] } a您可以使用

我想找到一种更好的方法,根据R中的逻辑函数将列表折叠成数据帧。下面是一个可复制的示例,说明了对我有效的方法:

a <- data.frame(foo = c(1:3), bar = c(letters[1:3]))
bazL <- list(c("a", "z", "g"), NULL, "c")

a$baz <- NULL
for(i in 1:length(a$foo)) {
  a$baz[i] <- (bazL[[i]] > 0)[1]
}

a您可以使用
is.null
检查每个列表项是否为空

#a$baz = 
!sapply(bazL, is.null)
#[1]  TRUE FALSE  TRUE

您可以使用
is.null
检查每个列表项是否为空

#a$baz = 
!sapply(bazL, is.null)
#[1]  TRUE FALSE  TRUE

我们可以使用
Filter
过滤掉
列表中的空元素

Filter(Negate(is.null), bazL)

或者获取一个逻辑向量

lengths(bazL)>0
#[1]  TRUE FALSE  TRUE

我们可以使用
Filter
过滤掉
列表中的空元素

Filter(Negate(is.null), bazL)

或者获取一个逻辑向量

lengths(bazL)>0
#[1]  TRUE FALSE  TRUE

您可以使用
purr
软件包提供的
map
功能。比如说,

library(dplyr)
library(purrr)

a <- mutate(a, baz = map(bazL, ~ !is.null(.x)))
库(dplyr)
图书馆(purrr)

a您可以使用
purr
软件包提供的
map
功能。比如说,

library(dplyr)
library(purrr)

a <- mutate(a, baz = map(bazL, ~ !is.null(.x)))
库(dplyr)
图书馆(purrr)

很好的回答。这将很好地推广到我将在列表上进行的其他工作中。回答不错。这将很好地推广到我将在列表上进行的其他工作中。简单而有效。我没有测试过滤函数,但这不是与取消列表相同吗?@Simon如果在
向量的
列表上使用
取消列表
,它会将其更改为单个
向量
。在
数据框
列表
上应用
过滤器
,以根据功能条件简单有效地删除单个组件,即列或列表元素。我没有测试过滤函数,但这不是与取消列表相同吗?@Simon如果在
向量的
列表上使用
取消列表
,它会将其更改为单个
向量
。在
数据框
列表
上应用
过滤器
,根据功能条件删除单个组件,即列或列表元素purr包的使用非常好。purr包的使用非常好。