Улучшение R-кодирования с помощью справки - PullRequest
2 голосов
/ 01 апреля 2011

Я борюсь с небольшим количеством кода.Я могу заставить его работать очень неэффективно, но подумал, что должен быть лучший способ это исправить.Я пытаюсь скомпилировать переменную из нескольких разных переменных.В закодированных переменных «пропуск» кодируется как конкретное число (для примера ниже «99»).Я пытаюсь создать переменную общей стоимости на основе 10 из этих переменных.

Таким образом, я создал неэффективный код, который работает:

var1 <- ifelse(data$v1<99, data$v1, 0)  
var2 <- ifelse(data$v2<99, data$v2, 0) 
... 
var10 <- ifelse(data$v1<99, data$v10, 0) 
sumvar <- var1 + var2 + var3 + var4 + var5 + var6 + var7 + var8 + var9 + var10

Я пытался использовать команду sapply, чтобы сделать ее более элегантной, но она не сработала.Я просто пытался понять, может ли кто-нибудь дать мне несколько советов или помочь понять, почему мой код не работает.Я помещаю его в среду списка (что я считаю правильным после попытки других, таких как cbind) и пытаюсь сделать определенный вызов, но получаю ошибку.В качестве примера кода я настроил следующее:

set.seed(1234)
data <- data.frame(x=rnorm(30), y=rnorm(30), z=rnorm(30))
data$x <- ifelse(data$x > 1, 99, data$x)
data$y <- ifelse(data$y > 1, 99, data$y)
data$z <- ifelse(data$z > 1, 99, data$z)

t.list <- list(data$x, data$y, data$z)

sumvar1 <- sapply(1:length(t.list), function(i){
    tempvar <- ifelse(t.list[i] !=99, t.list[i], 0)
    sumvar1 <- sumvar1 + tempvar
})

Проблема в том, что, когда я пытаюсь использовать свой реальный код (или этот код), я получаю:

Error in storage.mode(test) <- "logical" : 
  (list) object cannot be coerced to type 'double'
Calls: sapply -> lapply -> FUN -> ifelse

Очевидно, что я делаю что-то не так, но я не уверен, что это такое.Я посмотрел на файл справки для ifelse, но я не понимаю сообщение об ошибке, которое выводится.Я получил код для выполнения неэффективным способом, но мне бы очень хотелось получить отзывы и знания о том, как улучшить свое будущее кодирование на R.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 апреля 2011

Если я правильно понимаю вашу проблему, я думаю, все, что вам нужно сделать, это:

## Set any skip values to be equal to zero
data[data == 99] = 0
## Work out the row means
apply(data, 1, sum)

Один комментарий. Вы думаете об использовании объекта отсутствующего значения R NA вместо установки 99 в 0.

4 голосов
/ 02 апреля 2011

Если это одинаковое значение (99) для всех переменных в вашем data.frame, просто работайте со всем data.frame сразу.1005 *

если вы хотите суммы столбцов

colSums(data*(data < 99))  # faster than apply(data*(data < 99), 2, sum)
...