基于条件从R列表中删除元素

5

我在R中有一个列表 l,如下所示。我想删除其中唯一的字母数字字符为0的元素。如何做到这一点?

# Create list
l <- list(c('108', '50', '0]'), c('109','58','0','0]'), c('18','0'))
l
[[1]]
[1] "108" "50"  "0]" 
[[2]]
[1] "109" "58"  "0"   "0]" 
[[3]]
[1] "18" "0" 

# What I want:
l
[[1]]
[1] "108" "50" 
[[2]]
[1] "109" "58" 
[[3]]
[1] "18"
3个回答

2
我们可以使用grepl来匹配0],使用否定符号(!)从list元素中删除这些值。
lapply(l, function(x) x[!grepl("^0$|\\]", x)])
#[[1]]
#[1] "108" "50" 

#[[2]]
#[1] "109" "58" 

#[[3]]
#[1] "18"

或者将其转换为数值型,同时删除NA元素以及0

lapply(l, function(x) x[!is.na(as.numeric(x)) & x != 0])

或者使用setdiff

lapply(l, setdiff, c("0", "0]"))

1
我相信这是一种通用的方式。
l2 <- lapply(l, function(s) {
  s <- gsub('[^[:digit:]]', '', s)
  s[nchar(sub('([^0]*)0([^0]*)', '\\1\\2', s)) != 0]
  })

l2
#[[1]]
#[1] "108" "50" 
#
#[[2]]
#[1] "109" "58" 
#
#[[3]]
#[1] "18"

1

更加通用的解决方案是,删除潜在的元素,例如"&% 00]"(其中唯一的字母数字字符是0

lapply(l, function(x) x[grep('^[0[:punct:][:blank:]]*$', x, invert = TRUE)])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接