【发布时间】:2019-02-07 15:01:54
【问题描述】:
我正在尝试使用以下数据集在列的子集中将 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 代表每个试验的分数。
试验次数表示应将NAs 重新编码为0 的列子集:试验次数内的NAs 表示缺失数据,应重新编码为0,而在试验次数之外的NAs 没有意义,应该保持NAs。因此,对于trials == 3 的行,t3 列中的NA 将被重新编码为0,但在trials == 2 的行中,t3 中的NA 仍将是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)
)
【问题讨论】:
标签: r apply na missing-data