【问题标题】:Function to assign cell value to subsequent NA-cells (same column) [duplicate]将单元格值分配给后续 NA 单元格的函数(同一列)[重复]
【发布时间】: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] &lt;- na.locf(test[,2])

标签: r if-statement na


【解决方案1】:

如果您不想加载另一个包,这里有一个可以工作的小单行函数:

rollForward <- function(x) {
    c(NA, x[!is.na(x)])[cumsum(!is.na(x)) + 1]
}

test[,"class"] <- rollForward(test[,"class"])
test
#       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

【讨论】:

  • 非常感谢乔希,这解决了它!
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多