簡體   English   中英

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

[英]How to change values across 1 row based on values in a column in R?

我在 1 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

任何建議將不勝感激 - 謝謝!

一種方法(用 NA 代替。以保留數據類型): match找到第一個 NA position, replace用 NA 替換那個 position - 1(前一個)中的值。 apply(data, 1, \(x)...)為每一行應用 function。 最后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, "."))

另一種方法,因為您已經在$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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM