Удалить элементы из списка в R на основе условия - PullRequest
3 голосов
/ 24 мая 2019

У меня есть список l в R, как показано ниже. Я хочу удалить элементы, где единственным буквенно-цифровым символом является 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 ]

1 голос
/ 24 мая 2019

Я считаю, что это универсальный способ.

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 голос
/ 24 мая 2019

Еще более общее решение, которое удаляет потенциальные элементы, такие как "&% 00]" (где единственные буквенно-цифровые символы 0)

lapply(l, function(x) x[grep('^[0[:punct:][:blank:]]*$', x, invert = TRUE)])
1 голос
/ 24 мая 2019

Мы можем использовать 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]"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...