我正在尝试使用以下数据集将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 没有意义,应保持NAs . 因此,对于 where 的行trials == 3,NAin 列t3将被重新编码为0,但在 where 的行中trials == 2,NAint3仍将是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)
)