Заменить все пустые списки на 0 с lapply - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу заменить все пустые списки (числовые (0)) значением 0 в следующем списке:

a <- list(numeric(0), 3.13887804749505, c(0.745977548064631, 15.7233179232099, 
4.32068483740438, 19.6680377065919, 9.24007013740377), numeric(0), 
    c(28.8670111833615, 1.27199935252619, 26.6173612819351, 46.8824614685704
    ), c(3.03425142063166, 3.08366863855608, 4.37959434697201, 
    4.00518501422067, 2.05826729526789, 2.29413068424335))

Я пытался это:

b <- lapply(a, function(x) ifelse(length(x)==0,0,x))

Но я получаю первый номер из каждого списка:

list(0, 3.13887804749505, 0.745977548064631, 0, 28.8670111833615, 
    3.03425142063166)

Есть ли способ сделать это с применением, а не с циклом? Цикл занимает очень много времени (список очень большой).

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Несмотря на то, что Ronak показал лучший способ решения этой конкретной проблемы, все же полезно посмотреть, в чем заключалась проблема с вашей попыткой lapply(), которая неправильно использует ifelse().

Вот близкая альтернатива, которая делает то, что намеревалась:

lapply(a, function(x) if (length(x) == 0) {0} else {x})

Альтернативные способы написания (стандартного, очень четкого и очень лаконичного) идентичного lapply() вызова:

lapply(
  a, function(x) {
    if (length(x) == 0) {
      0
    } else {
      x
    }
  } 
)

lapply(a, function(x) `if`(length(x) == 0, 0, x))
0 голосов
/ 04 сентября 2018

Мы можем использовать lengths, чтобы получить длину каждого элемента списка, а затем заменить элементы нулевой длины на 0.

a[lengths(a) == 0] <- 0

a
#[[1]]
#[1] 0

#[[2]]
#[1] 3.138878

#[[3]]
#[1]  0.7459775 15.7233179  4.3206848 19.6680377  9.2400701

#[[4]]
#[1] 0

#[[5]]
#[1] 28.867011  1.271999 26.617361 46.882461

#[[6]]
#[1] 3.034251 3.083669 4.379594 4.005185 2.058267 2.294131
...