【发布时间】:2015-05-04 16:38:42
【问题描述】:
感谢您花时间查看我的问题!我是论坛新手,对 R 也比较陌生,但我会尽力把问题表述清楚。
我有一大组树样本数据,每个人的行数不规则。在“类”变量列(此处为第 2 列)中,每个人的第一行都有一个值(1、2、3 或 4),随后的值为 NA。 我想将每个人的第一个值分配给相应的后续 NA 单元(属于同一个人)。
可重现的示例数据框(已编辑):
test <- cbind(c(1, 2, 3, NA, 4, NA, NA, NA, 5, NA, 6), c(3, 4, 3, NA, 1, NA, NA, NA, 2, NA, 1))
colnames(test) <- c("ID", "class")
ID class
[1,] 1 3
[2,] 2 4
[3,] 3 3
[4,] NA NA
[5,] 4 1
[6,] NA NA
[7,] NA NA
[8,] NA NA
[9,] 5 2
[10,] NA NA
[11,] 6 1
我要找的结果是这样的:
ID class
[1,] 1 3
[2,] 2 4
[3,] 3 3
[4,] NA 3
[5,] 4 1
[6,] NA 1
[7,] NA 1
[8,] NA 1
[9,] 5 2
[10,] NA 2
[11,] 6 1
我复制了这个主题的最后一个解决方案How to substitute several NA with values within the DF using if-else in R? 并试图像这样使其适应我的需求
test2 <- as.data.frame(t(apply(test["class"], 1, function(x)
if(is.na(x[1]) == FALSE && all(is.na(head(x[1], -1)[-1])))
replace(x, is.na(x), x[1]) else x)))
但它给了我错误“dim(x) 必须具有正长度”。我尝试了许多其他版本,它给了我各种各样的错误,我什至不知道从哪里开始。我该如何改进它?
【问题讨论】:
-
我会使用
na.locf函数(来自包zoo)或base-R alternative 在连续的NAs 上传播先前的值...即test[,2] <- na.locf(test[,2])
标签: r if-statement na