Я пытаюсь перекодировать NA
значения в 0
в подмножестве столбцов, используя следующий набор данных:
set.seed(1)
df <- data.frame(
id = c(1:10),
trials = sample(1:3, 10, replace = T),
t1 = c(sample(c(1:9, NA), 10)),
t2 = c(sample(c(1:7, rep(NA, 3)), 10)),
t3 = c(sample(c(1:5, rep(NA, 5)), 10))
)
С каждой строкой связано определенное количество испытаний (между 1-3), указанное в столбце trials
. столбцы t1-t3
представляют оценки для каждого испытания.
Количество испытаний указывает на подмножество столбцов, в которых NA
s должно быть перекодировано в 0
: NA
s, которые находятся в пределах числа испытаний, представляют пропущенные данные и должны быть перекодированы как 0
, в то время как NA
s вне числа испытаний не имеет смысла, и должно оставаться NA
s. Так, для строки, где trials == 3
, NA
в столбце t3
будет перекодировано как 0
, но в строке, где trials == 2
, NA
в t3
останется NA
.
Итак, я попытался использовать эту функцию:
replace0 <- function(x, num.sun) {
x[which(is.na(x[1:(num.sun + 2)]))] <- 0
return(x)
}
Это хорошо работает для отдельных векторов. Когда я пытаюсь применить ту же функцию к фрейму данных с apply()
, однако:
apply(df, 1, replace0, num.sun = df$trials)
Я получаю предупреждение:
In 1:(num.sun + 2) :
numerical expression has 10 elements: only the first used
В результате вместо значения num.sun
меняйте каждую строку в соответствии со значением в trials
, apply()
просто использует первое значение в столбце trials
для каждой отдельной строки. Как можно применить функцию, чтобы аргумент num.sun
изменился в соответствии со значением df$trials
?
Спасибо!
Редактировать: , как прокомментировали некоторые, исходные данные примера имели некоторые не-NA оценки, которые не имели смысла согласно столбцу испытаний. Вот исправленный набор данных:
df <- data.frame(
id = c(1:5),
trials = c(rep(1, 2), rep(2, 1), rep(3, 2)),
t1 = c(NA, 7, NA, 6, NA),
t2 = c(NA, NA, 3, 7, 12),
t3 = c(NA, NA, NA, 4, NA)
)