Выполнение действий по списку - PullRequest
1 голос
/ 03 мая 2011

У меня есть список фреймов данных, все из которых содержат числовые данные.Как бы я изменил внутренние data.frames таким образом, чтобы значения NA = 0 и что-либо> или = 1 равнялось 1. В основном, конвертируем в data.frames ноль и единицу.

Быстрый пример.

x <- list()
x$a <- data.frame(c(NA, NA, 7, 7, NA), c(1,1,NA,NA,NA))
x$b <- data.frame(c(NA, NA, 7, 7, NA), c(1,1,NA,NA,NA))
x$c <- data.frame(c(NA, NA, 7, 7, NA), c(1,1,NA,NA,NA))

Как правило, если бы я делал только одно, я бы сделал что-то вроде:

x$a[x$a >= 1] <- 1
x[is.na(x$a)] <- 0

Теперь, как мне применить это ко всему списку?

ОБНОВЛЕНИЕ: Кто-нибудь хочет добавить решение с помощью ldply () для хорошей меры?

Ответы [ 3 ]

4 голосов
/ 03 мая 2011

Возможно, есть более короткое / более эффективное решение, но оно работает:

lapply(x, function(y) {y[y >= 1] <- 1; y[is.na(y)] <- 0; y})
3 голосов
/ 03 мая 2011

Гнездо применяется в течение дня:

lapply(x, function(x) 
    apply(x, 2, function(y) ifelse(is.na(y), 0, ifelse(y >= 1, 1, y))
    )
)
1 голос
/ 03 мая 2011

Вот еще один действительно запутанный способ сделать это. Он работает, сначала заменяя все NA на 0, а затем выбирая минимум числа и 1. Это просто для иллюстрации и забавы, и НЕ рекомендуется, так как это кошмарный код для поддержки!

lapply(lapply(x, function(y) replace(y, is.na(y), 0)), sapply, pmin, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...