合并时替换和更改列值

时间:2015-12-21 23:29:42

标签: r merge

我正在合并两个作为数据框创建的表

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。

任何帮助都非常感谢!

3 个答案:

答案 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的值。