根据条件从R中的列表中删除元素

时间:2019-05-24 18:55:59

标签: r list

我在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 个答案:

答案 0 :(得分:1)

我们可以使用grepl来匹配0]并取反(!)来删除list元素中的值

lapply(l, function(x) x[!grepl("^0$|\\]", x)])
#[[1]]
#[1] "108" "50" 

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

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

或转换为numeric并删除NA元素和0

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

或使用setdiff

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

答案 1 :(得分: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"

答案 2 :(得分:1)

一种更通用的解决方案,它删除了诸如"&% 00]"(其中唯一的字母数字字符为0)之类的潜在元素

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