R语言 如何创建一个新变量来输出行的最终响应[duplicate]

yb3bgrhw  于 2023-01-18  发布在  其他
关注(0)|答案(4)|浏览(119)
    • 此问题在此处已有答案**:

Select last non-NA value in a row, by row(3个答案)
For each row return the column index and name of non-NA value(3个答案)
Return name of last data frame column which is not NA in each row(3个答案)
13小时前关门了。
我试图在现有的数据框中创建一个新变量,它对应于该行响应的最后一个值,并标识该响应来自哪一列,但我没有运气能够弄清楚这一点。
我希望从:

id X_1 X_2 X_3 X_4 X_5
1  1   1   3   5  NA  NA
2  2   2   4  NA  NA  NA
3  3   5   5   6   5   3
4  4   6   6  NA  NA  NA
5  5   8   2   6   6   6
6  6  12   3   2   2  NA

对此:

id X_1 X_2 X_3 X_4 X_5 X_final X_final_location
1  1   1   3   5  NA  NA       5              X_3
2  2   2   4  NA  NA  NA       4              X_2
3  3   5   5   6   5   3       3              X_5
4  4   6   6  NA  NA  NA       6              X_2
5  5   8   2   6   6   6       6              X_5
6  6  12   3   2   2  NA       2              X_4
hfyxw5xn

hfyxw5xn1#

您可以使用以下命令按行查找最后出现的(非空)值的索引,

index <- rowSums(!is.na(df[,2:6]))

然后你可以得到这些索引的值并进行赋值,

df$X_final<-df[ as.matrix(data.frame(df[,1], index+1))]
 df$X_final_location <- paste0("X_",index)

给出,

#  id X_1 X_2 X_3 X_4 X_5 X_final X_final_location
#  1  1   1   3   5  NA  NA       5              X_3
#  2  2   2   4  NA  NA  NA       4              X_2
#  3  3   5   5   6   5   3       3              X_5
#  4  4   6   6  NA  NA  NA       6              X_2
#  5  5   8   2   6   6   6       6              X_5
#  6  6  12   3   2   2  NA       2              X_4
iswrvxsc

iswrvxsc2#

以下是tidyverse的方法:

library(dplyr)
library(tidyr)

df %>% 
  pivot_longer(-id, names_to = "X_final_location", values_to = "X_final") %>%
  group_by(id) %>% 
  na.omit() %>% 
  slice(n()) %>% 
  full_join(df, by="id")
id X_final_location X_final   X_1   X_2   X_3   X_4   X_5
  <int> <chr>              <int> <int> <int> <int> <int> <int>
1     1 X_3                    5     1     3     5    NA    NA
2     2 X_2                    4     2     4    NA    NA    NA
3     3 X_5                    3     5     5     6     5     3
4     4 X_2                    6     6     6    NA    NA    NA
5     5 X_5                    6     8     2     6     6     6
6     6 X_4                    2    12     3     2     2    NA
vvppvyoh

vvppvyoh3#

我们可以使用tail来获取最后一个元素,x[!is.na(x)]只查找非空值。apply是在数据的每一行中应用函数。

x_final <- apply(data, 1, \(x) tail(x[!is.na(x)],1))
x_final_location <- names(data)[apply(data, 1, \(x) max(which(!is.na(x))))]
 
cbind(data,x_final,x_final_location)

退货:

id X_1 X_2 X_3 X_4 X_5 x_final x_final_location
1  1   1   3   5  NA  NA       5              X_3
2  2   2   4  NA  NA  NA       4              X_2
3  3   5   5   6   5   3       3              X_5
4  4   6   6  NA  NA  NA       6              X_2
5  5   8   2   6   6   6       6              X_5
6  6  12   3   2   2  NA       2              X_4
hzbexzde

hzbexzde4#

编号

library(dplyr)

data %>% 
  rowwise() %>% 
  mutate(
    X_final = tail(na.omit(c_across()),1),
    X_final_location = names(data)[length(na.omit(c_across()))-1]
    )

输出

# A tibble: 6 x 8
# Rowwise: 
     id   X_1   X_2   X_3   X_4   X_5 X_final X_final_location
  <int> <int> <int> <int> <int> <int>   <int> <chr>           
1     1     1     3     5    NA    NA       5 X_3             
2     2     2     4    NA    NA    NA       4 X_2             
3     3     5     5     6     5     3       3 X_5             
4     4     6     6    NA    NA    NA       6 X_2             
5     5     8     2     6     6     6       6 X_5             
6     6    12     3     2     2    NA       2 X_4

相关问题