我正在合并两个作为数据框创建的表
chairs <- data.frame(sales.rep = c("bob", "tom"), sales = c(5,7) )
tables <- data.frame(sales.rep = c("bob", "john"),sales = c(55,77) )
merge(x = chairs, y = tables, by = "sales.rep", all = F)
结果是
sales.rep sales.x sales.y
1 bob 5 55
我有两个问题。如何只创建sales.x
覆盖sales.y
的一列?如下:
sales.rep sales
1 bob 55
第二个问题是,是否有办法进行外部联接,并且只有一个销售列的销售额来自sales.y
,除非sales.y
为NA。如下所示:
sales.rep sales sales.y
1 bob 55
2 tom 7
3 john 77
换句话说,我只需要来自sales.y
的值,除非它是NA。
任何帮助都非常感谢!
答案 0 :(得分:3)
对于第一个问题,您想要从合并中获得的是您的表数据帧。您不能仅使用一列合并,因为没有任何内容可以合并。 如果你有更多专栏并且想忽略一个,那就说你有:
chairs <- data.frame(sales.rep = c("bob", "tom"),colour=c("blue","red"), sales = c(5,7) )
那么你可以得到
merge(x=chairs[,1:2],y=tables)
给你
sales.rep colour sales
1 bob blue 55
第二: 在这里一步一步:
tmp <- merge(x=chairs,y=tables,by=c('sales.rep'),all=T)
tmp$sales.x[is.na(tmp$sales.x)] <- tmp$sales.y[is.na(tmp$sales.x)]
tmp$sales.y<-""
names(tmp)[3]<-"sales"
答案 1 :(得分:2)
这是针对第一个问题的data.table
解决方案:使用不包含&#34;销售&#34;的主席的子集进行内部联接。柱:
library(data.table)
chairs <- data.table(chairs)
tables <- data.table(tables)
tables[chairs[,!"sales",with=F], nomatch=0L, on = "sales.rep"]
第二个问题,你必须一步一步走。
答案 2 :(得分:1)
看起来没有一步。我已经使用SAS一段时间了,SAS有一个很好的数据合并功能,你可以在一个合并步骤中做这样的技巧。话虽如此,感谢那些帮助和查看其他人代码的人,这里有什么对我有用
chairs <- data.frame(sales.rep = c("bob", "tom"), sales = c(5,7) )
tables <- data.frame(sales.rep = c("bob", "john"),sales = c(55,77) )
df.new <- merge(x = chairs, y = tables, by = "sales.rep", all = T)
df.new$sales.x[!is.na(df.new$sales.y)] <-
df.new$sales.y[!is.na(df.new$sales.y)]
df.new$sales <- df.new$sales.x
df.new <- df.new[c("sales.rep","sales")]
这给了我想要的东西,结果如下:
> df.new
sales.rep sales
1 bob 55
2 tom 7
3 john 77
上面的数据框给出了sales.y的值,当sales.y没有丢失时以及缺少它时,它给出了来自sales.x的值。