r добавить столбцы в df1 с количеством строк в df2 (условно)

У меня есть два фрейма данных в R, как показано ниже ... Мне нужно добавить новый столбец (count_orders) в df1, который содержит количество заказов в 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

person Ravi Kumar    schedule 31.05.2015    source источник
comment
Попробуйте: df1$count_orders<-table(df2$buyer)[as.character(df1$buyer)]   -  person nicola    schedule 31.05.2015


Ответы (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) %>% right_join(df1) и позволить dplyr самостоятельно определить столбец, к которому нужно присоединиться (в данном случае «покупатель»).

person talat    schedule 31.05.2015
comment
Спасибо за такой подход .... теперь я выполняю много других операций с моими фактическими данными. - person Ravi Kumar; 31.05.2015

Вот возможное data.table решение, которое выполняет двоичное соединение между df1 и df2 при вычислении длины при соединении с использованием by = .EACHI

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]
person David Arenburg    schedule 31.05.2015

Ты можешь попробовать:

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
person nicola    schedule 31.05.2015
comment
Это очень хорошее / эффективное решение. работает хорошо, даже если некоторые уровни отсутствуют в df2 - person David Arenburg; 31.05.2015
comment
Tx Дэвид, очень признателен! - person nicola; 31.05.2015
comment
Или, может быть (не проверено) setkey(dt1,buyer);dt1[setkey(dt2[,list(count_orders=.N),by=buyer],buyer)], где dt1 и dt2 - это data.table версия df1 и df2. - person nicola; 31.05.2015
comment
@DavidArenburg Я думаю, вы могли бы опубликовать свой комментарий в качестве ответа, чтобы показать data.table решение и .EACHI использование, которые могут быть полезны в целом. - person nicola; 31.05.2015
comment
Хорошо, кстати, проблема с вашим решением в том, что оно вернет вектор, если только одна группа в df1 соответствует df2, а data.table просто не имеет аргумента drop - person David Arenburg; 31.05.2015
comment
Хорошо, я добавил измененную версию вашего предложения при добавлении := i.N, и теперь оно работает правильно. - person David Arenburg; 31.05.2015