2

Допустим у меня есть список: listt = list(c("best", "ever", "string", "", "or", "", "not")), мне нужно удалить все пустые строки в нем.
Я делаю так:
listt[sapply(listt, nchar) > 0], но на выход получаю:

[[1]]
[1] "best"   "ever"   "string" ""       "or"     ""       "not"   

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL 

Не совсем понимаю в чем проблема, буду рад любой помощи, так и объяснению моей проблемы, так и решению изначальной (удаление пустых строк)

2 Answers2

1

Попробуйте этот пример:

lapply(listt, function(i) i[ nchar(i) > 0 ] )
# [[1]]
# [1] "best"   "ever"   "string" "or"     "not"
zx8754
  • 113
1

«проблема» начинается вот с этой конструкции:

> list(c("best", "ever", "string", "", "or", "", "not"))
[[1]]
[1] "best"   "ever"   "string" ""       "or"     ""       "not"

как видим, в ней список состоит только из одного элемента (включающего вектор из семи строк).

судя же по дальнейшим манипуляциям, вам нужен список, состоящий из семи элементов. получить его можно, например, заменив функцию list() на as.list():

> as.list(c("best", "ever", "string", "", "or", "", "not"))
[[1]]
[1] "best"

[[2]]
[1] "ever"

[[3]]
[1] "string"

[[4]]
[1] ""

[[5]]
[1] "or"

[[6]]
[1] ""

[[7]]
[1] "not"

из такого списка функция sapply() извлечёт именно то, что вы ожидаете:

> listt <- as.list(c("best", "ever", "string", "", "or", "", "not"))
> listt[sapply(listt, nchar) > 0]
[[1]]
[1] "best"

[[2]]
[1] "ever"

[[3]]
[1] "string"

[[4]]
[1] "or"

[[5]]
[1] "not"