【问题标题】:r add columns in df1 with count of rows in df2 (conditional)r 在 df1 中添加列和 df2 中的行数(条件)
【发布时间】:2015-05-31 09:41:33
【问题描述】:

我在 R 中有两个数据框,如下所示...我需要在 df1 中添加新列(count_orders),其中包含 df2 中的订单数(或 df2 中的买家数)。 请帮忙。

> df1
  buyer city
1     A   xx
2     B   yy
3     C   zz
> df2
  order buyer item
1     1     A    1
2     2     A    2
3     3     B    1
4     4     A    2
5     5     B    1
6     6     C    3
7     7     C    4

预期输出:

> df1
  buyer city count_orders
1     A   xx   3
2     B   yy   2
3     C   zz   2

【问题讨论】:

  • 试试:df1$count_orders<-table(df2$buyer)[as.character(df1$buyer)]

标签: r dataframe rowsum


【解决方案1】:

这是一个可能的data.table 解决方案,它在使用by = .EACHI 连接时计算长度时在df1df2 之间执行二进制连接

library(data.table)  
setkey(setDT(df2), buyer)  
df2[df1, list(city, count_orders = .N), by = .EACHI]
#    buyer city count_orders
# 1:     A   xx            3
# 2:     B   yy            2
# 3:     C   zz            2

替代方法(修改@nicolas 评论)可能是(将通过引用更新df1

library(data.table)  
setkey(setDT(df1), buyer)  
df1[setDT(df2)[, .N, keyby = buyer], count_orders := i.N]

【讨论】:

    【解决方案2】:

    你可以试试:

    df1$count_orders<-as.vector(table(df2$buyer)[as.character(df1$buyer)])
    #  buyer city count_orders
    #1     A   xx            3
    #2     B   yy            2
    #3     C   zz            2
    

    【讨论】:

    • 这是一个非常好的/有效的解决方案。即使df2中不存在某些级别,也能正常工作
    • Tx David,非常感谢!
    • 或者可能(未测试)setkey(dt1,buyer);dt1[setkey(dt2[,list(count_orders=.N),by=buyer],buyer)],其中dt1dt2data.table 版本的df1df2
    • @DavidArenburg 我想您可以将您的评论作为答案发布以显示data.table 解决方案和.EACHI 用法,这通常可能会有所帮助。
    • 好的,顺便说一句,您的解决方案的问题是,如果df1 中只有一个组与df2 匹配,那么它将返回一个向量,而data.table 根本没有@ 987654334@参数
    【解决方案3】:

    这是一个 dplyr 方法:

    library(dplyr)
    count(df2, buyer) %>% right_join(df1, "buyer")
    #Source: local data frame [3 x 3]
    #
    #  buyer n city
    #1     A 3   xx
    #2     B 2   yy
    #3     C 2   zz
    

    您可以使用 count(df2, buyer) %&gt;% right_join(df1) 并让 dplyr 自己找出要加入的列(在本例中为“买家”)。

    【讨论】:

    • 感谢这种方法....现在我正在对我的实际数据进行很多其他操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2017-01-01
    • 2020-09-26
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多