如何在R语言中转换指定数据格式并将NA替换为空值?
R语言数据重塑与NA替换为空的解决方案
问题背景
现有如下样本数据,需要将其重塑为指定格式,并将结果中的NA替换为空值:
样本数据
dat <- read.table(text=" Id RA EA R B M value 1 2 2 3 4 5 14 2 2 3 1 2 3 9 3 1 2 2 2 2 8 ", header=TRUE)
期望输出
Id RA EA R B M 1 2 2 3 4 5 1 2 14 2 2 3 1 2 3 2 2 9 3 1 2 2 2 2 3 1 8
尝试的代码(未达成需求)
dat2 <- dat %>% gather(Type, EA, M, value) %>% mutate_at(vars(-Id, -RA, -EA), funs(ifelse(Type %in% "value", NA, .))) %>% select(Id, RA, EA, R, B, M) %>% arrange(Id)
解决方案
原代码的gather逻辑有误,且未处理数值列无法存储空字符串的问题。以下是修正后的完整代码:
library(dplyr) # 生成目标结构数据 dat2 <- dat %>% rowwise() %>% summarise( Id = rep(Id, 2), RA = rep(RA, 2), EA = c(EA, value), R = c(R, NA), B = c(B, NA), M = c(M, NA) ) %>% ungroup() %>% # 将数值列转为字符型以支持空字符串 mutate(across(c(R, B, M), as.character)) %>% # 替换NA为空字符串 replace(is.na(.), "") %>% arrange(Id) # 打印时显示空值而非NA print(dat2, na.print = "")
关键说明
- 数据重塑:通过
rowwise()+summarise()为每行生成两条记录,一条保留原EA与R/B/M值,另一条用value替换EA并将R/B/M设为NA。 - 类型转换:由于R的数值列无法存储空字符串,需将
R/B/M转为字符类型。 - NA替换:使用
replace(is.na(.), "")将所有NA替换为空字符串,最后通过print的na.print参数确保输出时显示为空。
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

