我在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"
答案 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)])