用计算值替换缺失值
Replace missing values with calculated values
我正在尝试学习如何用计算值替换一个变量中缺失的数据。
我的数据集 (bk3
) 看起来像:
ign: 80, 96, 75, 66, 53
Mean: 26, 24, 27, 34, 41
sd: 6, 7, NA, 8, 4
lci: 24, 25, 20, 32, 38
uci: 29, 26, 29, 33, 43
输出:
bk3 <- structure(list(ign = c(80L, 96L, 75L, 66L, 53L), mean = c(26L, 24L,
27L, 34L, 41L), sd = c(6L, 7L, NA, 8L, 4L), lci = c(24L, 25L, 20L,
32L, 38L), uci = c(29L, 26L, 29L, 33L, 43L)), .Names = c("ign",
"mean", "sd", "lci", "uci"), class = "data.frame", row.names = c(NA, -5L))
基本上,我使用 95% 置信区间 (uci
、lci
) 和样本 n (ign
) 来计算缺失的 SD (sd
).
我尝试使用的代码是:
bk3$sd[is.na(bk3$sd)] <- (bk3$uci - bk3$lci) * sqrt(bk3$ign)/3.92
但我收到以下警告消息:
"number of items to replace is not a multiple of replacement length"
更新:我正在尝试创建一个函数,它会在提供适当变量的情况下自动执行此操作。我已尝试将其设置为以下格式:
fillsd <- function(x, n, u, l)
{
i1 <- is.na(x)
i2 <- n > 59
x[i1 & i2] <- with(df, (u[i1 & i2] - l[i1 & i2]) * (sqrt(n[i1 &
i2])/3.92)) }
虽然函数 "fillsd" 似乎已在我的全局环境中正确保存,但当我尝试将其与以下代码一起使用时它不起作用:
fillsd(x="bk3$sd", n="bk3$ign", u="bk3$uci", l="bk3$lci")
该代码没有产生错误消息,但该函数似乎也没有执行任何操作。这是我处理的第一个函数,我一直没能找到可比较的例子来知道代码的哪一部分是不正确的。如果您对如何进行这项工作有任何想法,请告诉我。谢谢!
如果我们replace
'sd'的NA元素与其他列计算值对应的元素,那么逻辑索引应该在两边赋值。根据计算的性质,它给出的长度等于数据集的行数,而 lhs 的长度更短,因为我们仅对具有 NA 元素的行进行子集化,这会导致长度不平等,从而导致错误
i1 <- is.na(bk3$sd)
bk3$sd[i1] <- with(bk3, (uci[i1] - lci[i1]) * sqrt(ign[i1])/3.92)
但是,如果我们决定根据某些列的 sum
的 mean
来获取摘要,那么它是一个数字,并且没有逻辑索引是有意义的rhs 作为值被回收
数据
bk3 <- structure(list(ign = c(80, 96, 75, 66, 53), Mean = c(26, 24,
27, 34, 41), sd = c(6, 7, NA, 8, 4), lci = c(24, 25, 20, 32,
38), uci = c(29, 26, 29, 33, 43)), .Names = c("ign", "Mean",
"sd", "lci", "uci"), row.names = c(NA, -5L), class = "data.frame")
我正在尝试学习如何用计算值替换一个变量中缺失的数据。
我的数据集 (bk3
) 看起来像:
ign: 80, 96, 75, 66, 53
Mean: 26, 24, 27, 34, 41
sd: 6, 7, NA, 8, 4
lci: 24, 25, 20, 32, 38
uci: 29, 26, 29, 33, 43
输出:
bk3 <- structure(list(ign = c(80L, 96L, 75L, 66L, 53L), mean = c(26L, 24L,
27L, 34L, 41L), sd = c(6L, 7L, NA, 8L, 4L), lci = c(24L, 25L, 20L,
32L, 38L), uci = c(29L, 26L, 29L, 33L, 43L)), .Names = c("ign",
"mean", "sd", "lci", "uci"), class = "data.frame", row.names = c(NA, -5L))
基本上,我使用 95% 置信区间 (uci
、lci
) 和样本 n (ign
) 来计算缺失的 SD (sd
).
我尝试使用的代码是:
bk3$sd[is.na(bk3$sd)] <- (bk3$uci - bk3$lci) * sqrt(bk3$ign)/3.92
但我收到以下警告消息:
"number of items to replace is not a multiple of replacement length"
更新:我正在尝试创建一个函数,它会在提供适当变量的情况下自动执行此操作。我已尝试将其设置为以下格式:
fillsd <- function(x, n, u, l)
{
i1 <- is.na(x)
i2 <- n > 59
x[i1 & i2] <- with(df, (u[i1 & i2] - l[i1 & i2]) * (sqrt(n[i1 &
i2])/3.92)) }
虽然函数 "fillsd" 似乎已在我的全局环境中正确保存,但当我尝试将其与以下代码一起使用时它不起作用:
fillsd(x="bk3$sd", n="bk3$ign", u="bk3$uci", l="bk3$lci")
该代码没有产生错误消息,但该函数似乎也没有执行任何操作。这是我处理的第一个函数,我一直没能找到可比较的例子来知道代码的哪一部分是不正确的。如果您对如何进行这项工作有任何想法,请告诉我。谢谢!
如果我们replace
'sd'的NA元素与其他列计算值对应的元素,那么逻辑索引应该在两边赋值。根据计算的性质,它给出的长度等于数据集的行数,而 lhs 的长度更短,因为我们仅对具有 NA 元素的行进行子集化,这会导致长度不平等,从而导致错误
i1 <- is.na(bk3$sd)
bk3$sd[i1] <- with(bk3, (uci[i1] - lci[i1]) * sqrt(ign[i1])/3.92)
但是,如果我们决定根据某些列的 sum
的 mean
来获取摘要,那么它是一个数字,并且没有逻辑索引是有意义的rhs 作为值被回收
数据
bk3 <- structure(list(ign = c(80, 96, 75, 66, 53), Mean = c(26, 24,
27, 34, 41), sd = c(6, 7, NA, 8, 4), lci = c(24, 25, 20, 32,
38), uci = c(29, 26, 29, 33, 43)), .Names = c("ign", "Mean",
"sd", "lci", "uci"), row.names = c(NA, -5L), class = "data.frame")