过滤并映射 R 中的列表
Filter and map over a list in R
我可以用 lapply
:
在 R 中的列表上做一个映射
lapply(1:10,function(y) { if (y %% 2 == 0) {y+42}})
(这给了我一个 1 到 10 之间的列表,其中每个其他对象都是 NULL)。
此外,我可以使用 Filter
:
删除每个 NULL 对象
Filter(function(x) !is.null(x),
lapply(1:10,function(y) { if (y %% 2 == 0) {y+42}}))
(这给了我一个 1 到 10 之间的偶数列表)。
另一个例子,假设我们要获取一个字符串列表,并过滤掉所有以 "a" 开头的字符串,然后将 "Foo" 附加到剩余的字符串。可以使用类似的技术:
Filter(function(x) !is.null(x),
lapply(c("foo","abar","baz"),
function(y) { if (grepl("^a",y)) {paste("foo",y)}}))
有没有更好的方法在 R 中对列表进行折叠
你可以试试
y <- 1:10
as.list(y[y%%2==0]+42)
grep
也可以在向量中工作
grepl(paste(c(2,4,6), collapse="|"), y)
#[1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE
y1 <- letters[1:10]
paste('foo', y1[grepl('^a', y1)])
#[1] "foo a"
我可以用 lapply
:
lapply(1:10,function(y) { if (y %% 2 == 0) {y+42}})
(这给了我一个 1 到 10 之间的列表,其中每个其他对象都是 NULL)。
此外,我可以使用 Filter
:
Filter(function(x) !is.null(x),
lapply(1:10,function(y) { if (y %% 2 == 0) {y+42}}))
(这给了我一个 1 到 10 之间的偶数列表)。
另一个例子,假设我们要获取一个字符串列表,并过滤掉所有以 "a" 开头的字符串,然后将 "Foo" 附加到剩余的字符串。可以使用类似的技术:
Filter(function(x) !is.null(x),
lapply(c("foo","abar","baz"),
function(y) { if (grepl("^a",y)) {paste("foo",y)}}))
有没有更好的方法在 R 中对列表进行折叠
你可以试试
y <- 1:10
as.list(y[y%%2==0]+42)
grep
也可以在向量中工作
grepl(paste(c(2,4,6), collapse="|"), y)
#[1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE
y1 <- letters[1:10]
paste('foo', y1[grepl('^a', y1)])
#[1] "foo a"