我正在尝试将两个数据集合并为一个,使用一个包含相同值的公共列,其中只有一个数据集具有重复的行。我尝试过使用merge,left_join和inner_join,但R似乎无法将某些值读取为相同。
示例:
数据集#1
df1:
id month
1 oct
2 dec
3 oct
数据集#2
id color
1 blue
1 red
1 yellow
2 red
3 yellow
3 blue
4 orange
我想要的结果就像这样
dfboth:
id color month
1 blue oct
1 red oct
1 yellow oct
2 red dec
3 yellow oct
3 blue oct
4 orange NA
但是R总是给我一些以下内容
dfboth:
id color month
1 blue NA
1 red NA
1 yellow NA
2 red dec
3 yellow oct
3 blue oct
4 orange NA
我尝试过使用
dfboth <- merge(df2, df1, by.x="id", by.y="id", all.x = TRUE)
和
dfboth <- left_join(df2, df1, by="id")
我还尝试更改列的类型(数字,整数,字符),但这只会更改R无法读取的“id”。
我有点像“R”的初学者,不知道什么可能是这个问题,所以我很感激你有任何想法。
谢谢:)
答案 0 :(得分:1)
与dplyr的left_join()
一起工作正常:
df1 <- read.table(text = "id month
1 oct
2 dec
3 oct", header = TRUE)
df2 <- read.table(text = "id color
1 blue
1 red
1 yellow
2 red
3 yellow
3 blue
4 orange", header = TRUE)
library(dplyr)
dfboth <- left_join(df2, df1)
dfboth
# id color month
# 1 1 blue oct
# 2 1 red oct
# 3 1 yellow oct
# 4 2 red dec
# 5 3 yellow oct
# 6 3 blue oct
# 7 4 orange <NA>
答案 1 :(得分:-1)
我认为这会解决问题:
df1=tibble(id=c(1,2,3),month=c("oct","dec","oct"))
df2=tibble(id=c(1,1,1,2,3,3,4),color=c("blue","red","yellow","red","yellow","blue","orange"))
x0=(sapply(1:nrow(df2),function(x) which(df1$id==df2$id[x])))
x0<-sapply(x0,function(x) ifelse(length(x)>0,x,NA))
x01<-sapply(x0,length)
x01<-ifelse(x01>0,x01,NA)
df2$month<-sapply(x0,function(x) df1$month[x])
> df2
# A tibble: 7 x 3
id color month
<dbl> <chr> <chr>
1 1.00 blue oct
2 1.00 red oct
3 1.00 yellow oct
4 2.00 red dec
5 3.00 yellow oct
6 3.00 blue oct
7 4.00 orange NA