合并dataframe后无法替换值?R语言数据处理求助
你遇到的问题根源是默认情况下read.table会把字符列自动转换成因子(factor)类型,当你尝试用原始字符串去替换因子列里的NA时,R会把字符串映射成对应因子水平的数字,而不是保留字符串本身。下面是不用额外库的解决方案:
步骤1:修正数据读取(避免因子自动转换)
如果可以重新读取数据,建议加上stringsAsFactors=FALSE参数,让字符列保持字符类型,从根源避免问题:
# 读取所有数据时禁用自动转因子 df1 <- read.table(text = "Source Signal Target A no B B yes C C no D D no A E yes F F yes G G no E", header = T, stringsAsFactors=FALSE) df2 <- read.table(text = "Source Signal Target A no B B yes C E yes F F yes G", header = T, stringsAsFactors=FALSE) df3 <- read.table(text = "Symbol ID Name A 11 LetterA C 13 LetterC D 14 LetterD F 16 LetterF G 17 LetterG", header = T, stringsAsFactors=FALSE)
步骤2:合并数据并匹配替换
先合并df1和df2得到interactions,再完成匹配和NA替换:
# 合并数据 interactions <- merge(df1, df2) # 从df3匹配Source对应的信息,只保留需要的列 source_matched <- df3[match(interactions$Source, df3$Symbol), c("Symbol", "ID", "Name")] # 找出需要替换NA的行 na_positions <- is.na(source_matched$Symbol) # 用interactions里的原始Source值替换NA source_matched$Symbol[na_positions] <- interactions$Source[na_positions] source_matched$Name[na_positions] <- interactions$Source[na_positions]
现在查看结果:
print(source_matched)
会得到你想要的输出:
Symbol ID Name 1 A 11 LetterA 2 B NA B 3 E NA E 4 F 16 LetterF
如果不能重新读取数据(已有的因子列处理)
如果数据已经读取完毕,只需要先把相关的因子列转换成字符类型即可:
# 将因子列转为字符 df1$Source <- as.character(df1$Source) df2$Source <- as.character(df2$Source) df3$Symbol <- as.character(df3$Symbol) # 后续合并和替换步骤和上面完全一致 interactions <- merge(df1, df2) interactions$Source <- as.character(interactions$Source) source_matched <- df3[match(interactions$Source, df3$Symbol), c("Symbol", "ID", "Name")] na_positions <- is.na(source_matched$Symbol) source_matched$Symbol[na_positions] <- interactions$Source[na_positions] source_matched$Name[na_positions] <- interactions$Source[na_positions]
为什么之前的代码得到数字?
你之前的代码中,interactions$Source和df3$Symbol都是因子类型,match()返回的是因子水平的索引位置。当你给因子列Source$Symbol赋值时,R会把因子值转换成对应的水平数字(比如"B"如果是因子的第2个水平,就会赋值2),而不是保留字符串"B"。转换成字符类型后,就不会出现这个问题了。
内容的提问来源于stack exchange,提问作者Biocrazy
相关产品推荐
相关产品推荐

