首页 > 解决方案 > 合并一列不同长度的两个数据集时如何定义默认输入值?

问题描述

假设我有一个原始版本数据集,其中包含一组完整的“文本”(一个字符串变量),第二个数据集只包含那些新变量“值”取某个值(0、1 或不)。

现在我想将它们重新合并在一起,以便生成的数据集包含来自第一个数据集的全部“文本”,但还包括“值”,如果编码为 0和/或仅存在于原始数据集中,则该值应该为 0。

dat1<-data.frame(text=c("a","b","c","d","e","f","g","h"))     # original dataset
dat2<-data.frame(text=c("e","f","g","h"), value=c(0,NA,1,1))  # second version

最终数据集应如下所示:

> dat3
  text value
1    a     0
2    b     0
3    c     0
4    d     0
5    e     0
6    f    NA
7    g     1
8    h     1

但是,Base-R所做的是在我想要 s 的地方merge()引入s :NA0

dat3<-merge(dat1, dat2, by=c("text"), all=T)

当合并数据集的变量仅存在于一个数据集中而不存在于另一个数据集中时,有没有办法定义默认输入?换句话说,我怎样才能定义0为标准输入值而不是NA

我知道我可以暂时NA将第二个数据集中的 coded s 更改为其他内容,以便稍后区分“真实” NAs 和NA刚刚引入的 s,但我真的不想这样做,如果有另一种更清洁的方式。理想情况下,我想使用merge()orplyr::join()用于此目的,但在手册中找不到任何内容。

标签: rmerge

解决方案


我知道这也不理想,但需要考虑:

library(dplyr)
dat3 <- dplyr::left_join(dat1,dat2,all.x =T)
dat3[which(dat2$text != dat3$text),2] = 0

或者包装一个函数来调用一个单行:

merge_NA <- function(dat1,dat2){
  dat3 <- dplyr::left_join(dat1,dat2,all.x = T)
  dat3[which(dat2$text != dat3$text),2] = 0
  return(dat3)
}

现在,您只需调用:

merge_NA(dat1,dat2)

推荐阅读