Как я могу заменить определенное значение (например, -10000) на NA в большом списке? - PullRequest
0 голосов
/ 04 февраля 2019

Это работает для первого элемента списка:

values[[1]][values[[1]]==-10000] <-NA

Поскольку я не хочу циклически перебирать свои тысячи элементов списка, я ищу команду, которая делает то же самое для всего списка, например:

 values[values==-10000] <-NA

Но это не работает для списка типов:

Ошибка в значениях [values ​​== -10000] <- NA: (список) объект не может быть приведен к типу'double' </p>

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Как вы упомянули "большой список", я предоставляю второй вариант, в котором вместо этого используется replace, который немного быстрее по сравнению с ifelse.

Благодаря @TimBiegeleisen для данных

lst <- list(v1=-10000, v2=500, v3=c(1,2))
lapply(lst, function(x) replace(x, x == -10000, NA))
#$v1
#[1] NA
#
#$v2
#[1] 500
#
#$v3
#[1] 1 2

тест

l <- rep(lst, 100000)
library(microbenchmark)
benchmark <- microbenchmark(
  tim = lapply(l, function(x) ifelse(x==-10000, NA, x)),
  markus = lapply(l, function(x) replace(x, x==-10000, NA))
)

autoplot(benchmark) 

enter image description here

benchmark
#Unit: milliseconds
#   expr      min        lq      mean    median        uq      max neval cld
#    tim 931.5551 1003.0364 1054.7647 1018.7956 1082.3210 2536.373   100   b
# markus 432.3821  473.9881  500.4833  482.5838  515.9907 1023.392   100  a 
0 голосов
/ 04 февраля 2019

Использование na_if с map

library(tidyverse)
map(lst, na_if, y = -10000)
#$v1
#[1] NA

#$v2
#[1] 500

#$v3
#[1] 1 2

data

lst <- list(v1=-10000, v2=500, v3=c(1,2))
0 голосов
/ 04 февраля 2019

Попробуйте использовать lapply:

lst <- list(v1=-10000, v2=500, v3=c(1,2))
lapply(lst, function(x) ifelse(x==-10000, NA, x))

$v1
 [1] NA

$v2
[1] 500

$v3
[1] 1 2

Этот подход также надежен, даже если некоторые элементы списка не являются числами, а представляют собой другие вещи, например векторы.В этом случае вектор не будет соответствовать целевому значению и не будет изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...