将列名称作为 R 中的单元格值返回

问题描述 投票:0回答:2

对于这个数据框:


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)

r
2个回答
0
投票
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

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"
© www.soinside.com 2019 - 2024. All rights reserved.