对于这个数据框:
Indicator <- c('A',NA, 'I', NA)
A<- c('1',NA,NA,NA)
I<- c(NA,'0','0',NA)
E<- c(NA,NA,NA,'0')
data.frame(Indicator,A,I,E)
我想往下看Indicator栏;如果该值为 NA 我想查看其他列,并且在有非缺失值的地方我想将列名作为指标值返回。所以在这种情况下,结果应该是这样的:
Indicator <- c('A','I','I','E')
data.frame(Indicator,A,I,E)
data = data.frame(Indicator,A,I,E)
cols = c("A", "I", "E")
data$Indicator = ifelse(
is.na(data$Indicator),
cols[max.col(!is.na(data[cols]), ties.method = "first")],
data$Indicator
)
data
# Indicator A I E
# 1 A 1 <NA> <NA>
# 2 I <NA> 0 <NA>
# 3 I <NA> 0 <NA>
# 4 E <NA> <NA> 0
这是一个
tidyverse
方法:
library(dplyr)
library(tidyr)
# 1. as data frame
df %>%
mutate(across(A:E, ~case_when(!is.na(.) ~ cur_column()), .names = 'new_{col}')) %>%
unite(Indicator, starts_with('new'), na.rm = TRUE, sep = ' ') %>%
select(Indicator, everything())
Indicator A I E
1 A 1 <NA> <NA>
2 I <NA> 0 <NA>
3 I <NA> 0 <NA>
4 E <NA> <NA> 0
# 2. as vector
Indicator <- df %>%
mutate(across(A:E, ~case_when(!is.na(.) ~ cur_column()), .names = 'new_{col}')) %>%
unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ' ') %>%
pull(New_Col)
[1] "A" "I" "I" "E"