r - 合并一列不同长度的两个数据集时如何定义默认输入值?
问题描述
假设我有一个原始版本数据集,其中包含一组完整的“文本”(一个字符串变量),第二个数据集只包含那些新变量“值”取某个值(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 :NA
0
dat3<-merge(dat1, dat2, by=c("text"), all=T)
当合并数据集的变量仅存在于一个数据集中而不存在于另一个数据集中时,有没有办法定义默认输入?换句话说,我怎样才能定义0
为标准输入值而不是NA
?
我知道我可以暂时NA
将第二个数据集中的 coded s 更改为其他内容,以便稍后区分“真实” NA
s 和NA
刚刚引入的 s,但我真的不想这样做,如果有另一种更清洁的方式。理想情况下,我想使用merge()
orplyr::join()
用于此目的,但在手册中找不到任何内容。
解决方案
我知道这也不理想,但需要考虑:
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)
推荐阅读
- optimization - 如何在 Pyomo 中对变量设置简单的两个域约束?
- mysql - 在 Docker 容器外安装 MySQL 数据库
- javascript - 使用在集合中获得的值,将包含该集合索引的数组中的值推送到单独的数组中
- networking - 分布式选举算法在实践中是如何实现的(Bully、Ring 算法)?
- php - 我在加载网站时遇到问题,是否需要很长时间才能加载?
- swift - iOS 图表折线图缺少最后一个轴标签
- python - 如何获取字典键组合的唯一值集?
- php - 这种“模式”有名称吗?
- android-studio - Flutter Navigator.pop 不会发回数据
- android-studio - 如何根据我在 Android Studio 中的自定义词典在特定于语言环境的 strings.xml 中获得拼写警告?