gpt4 book ai didi

r - 将单元格值分配给后续 NA 单元格(同一列)的函数

转载 作者:行者123 更新时间:2023-12-02 17:35:45 25 4
gpt4 key购买 nike

感谢您花时间查看我的问题!我是论坛新手,对 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) 必须具有正长度”。我尝试了很多其他版本,但它给了我各种各样的错误,我什至不知道从哪里开始。我该如何改进?

最佳答案

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

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

关于r - 将单元格值分配给后续 NA 单元格(同一列)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28841787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com