如何根据R中一列的值更改一行的值?

wz3gfoph  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(200)

我在一个 Dataframe 中有很多列,它们标识同一变量的不同时间点。基本上,在我的数据中,如果在时间点X-1没有响应,则在时间点X或更长时间点也不会有响应(当NA出现在一行中后,它将继续)。我目前有一列显示最后一个响应来自哪一行以及该响应是什么。 Dataframe 目前如下所示:

id X1 X2 X3 X4 X_final X_final_location
1  1  5  5  6 NA       6               X3
2  2  4 NA NA NA       4               X1
3  3  7  1  3  5       5               X4
4  4  8  2  4  2       2               X4
5  5  1  5 NA NA       5               X2
6  6  5  7  7  7       7               X4

我的目标是能够使用每一行的最后一个响应作为结果变量来进行回归。但是,我不希望它在“X_final”列和响应实际来自的列中重复两次。因此,我希望找到一种方法,在值最初来自的单元格中放置一个.“”,这样它看起来就像这样:

id X1   X2 X3 X4 X_final X_final_location
1  1  5    5  6 NA       6               X3
2  2  . <NA> NA NA       4               X1
3  3  7    1  3  5       5               X4
4  4  8    2  4  2       2               X4
5  5  1    . NA NA       5               X2
6  6  5    7  7  7       7               X4

任何建议将不胜感激-谢谢!

aemubtdh

aemubtdh1#

一种方法(用NA代替.以保留数据类型):match找到第一个NA位置,replace将该位置- 1(上一个)中的值替换为NA。apply(data, 1, \(x) ...)对每行应用该函数。最后,t转置结果(因为默认情况下,apply会将结果强制转换为列。

data = data.frame(id = 1:6, X1 = c(5L, 4L, 7L, 8L, 1L, 5L), X2 = c(5L, 
NA, 1L, 2L, 5L, 7L), X3 = c(6L, NA, 3L, 4L, NA, 7L), X4 = c(NA, 
NA, 5L, 2L, NA, 7L), X_final = c(6L, 4L, 5L, 2L, 5L, 7L), X_final_location = c("X3", 
"X1", "X4", "X4", "X2", "X4"))

data[,2:5] <- t(apply(data[,2:5], 1 , function(x) replace(x, match(NA, x) - 1, NA)))

data
#>   id X1 X2 X3 X4 X_final X_final_location
#> 1  1  5  5 NA NA       6               X3
#> 2  2 NA NA NA NA       4               X1
#> 3  3  7  1  3  5       5               X4
#> 4  4  8  2  4  2       2               X4
#> 5  5  1 NA NA NA       5               X2
#> 6  6  5  7  7  7       7               X4

使用拆分的另一种方法(按行分组):

split(data, row.names(data)) <- 
   lapply(split(data, row.names(data)), \(x) replace(x, x$X_final_location, "."))
yvgpqqbh

yvgpqqbh2#

另一种方法,因为您已经有了$X_final_location中的位置。正如问题注解中提到的,如果回归分析的目标是保留数值,则首选NA值。

data_orig <- data.frame(
    id = c(1, 2, 3, 4, 5, 6),
    X1 = c(5, 4, 7, 8, 1, 5),
    X2 = c(5, NA, 1, 2, 5, 7),
    X3 = c(6, NA, 3, 4, NA, 7),
    X4 = c(NA, NA, 5, 2, NA, 7),
    X_final = c(6, 4, 5, 2, 5, 7),
    X_final_location = c("X3", "X1", "X4", "X4", "X2", "X4")
)

data_new <- data_orig
for (i in seq_len(nrow(data_new))) {
    data_new[i, data_new$X_final_location[i]] <- NA
}

data_new

#   id X1 X2 X3 X4 X_final X_final_location
# 1  1  5  5 NA NA       6               X3
# 2  2 NA NA NA NA       4               X1
# 3  3  7  1  3 NA       5               X4
# 4  4  8  2  4 NA       2               X4
# 5  5  1 NA NA NA       5               X2
# 6  6  5  7  7 NA       7               X4

相关问题