在R语言中将列名作为单元格值填充Indicator列
问题解决:填充数据框中Indicator列的缺失值
原始数据
先构造题目中的原始数据框:
Indicator <- c('A', NA, 'I', NA) A <- c('1', NA, NA, NA) I <- c(NA, '0', '0', NA) E <- c(NA, NA, NA, '0') df <- data.frame(Indicator, A, I, E)
此时数据框内容为:
> df Indicator A I E 1 A 1 <NA> <NA> 2 <NA> <NA> 0 <NA> 3 I <NA> 0 <NA> 4 <NA> <NA> <NA> 0
需求说明
当Indicator列的值为NA时,查找该行其余列(A、I、E)中的非缺失值,将对应列名作为Indicator的取值,最终得到Indicator列值为c('A','I','I','E')的数据框。
解决方案
方法一:Base R 实现
通过apply逐行处理数据:
df$Indicator <- apply(df, 1, function(row) { # 如果Indicator不为NA,直接保留原值 if (!is.na(row["Indicator"])) { return(row["Indicator"]) } # 否则找出当前行A/I/E列中非NA的列名 non_na_cols <- colnames(df)[-1][!is.na(row[-1])] return(non_na_cols) })
方法二:Tidyverse 实现
若习惯使用dplyr和tidyr,可用以下代码:
library(dplyr) library(tidyr) df <- df %>% rowwise() %>% mutate( Indicator = ifelse( is.na(Indicator), # 筛选除Indicator外的列,找出非NA的列名 names(select(., -Indicator))[!is.na(c_across(-Indicator))], Indicator ) ) %>% ungroup()
最终结果
运行上述任意一种方法后,数据框结果如下:
> df Indicator A I E 1 A 1 <NA> <NA> 2 I <NA> 0 <NA> 3 I <NA> 0 <NA> 4 E <NA> <NA> 0
内容的提问来源于stack exchange,提问作者Log On
相关产品推荐
相关产品推荐

