2014-01-21 2 views

ответ

4

Вот подход:

setNames(merge(aggregate(Number ~ F1, dat, sum), 
       aggregate(Number ~ F2, dat, sum), 
       by.x = "F1", by.y = "F2", all = TRUE), 
     c("Type", "F1", "F2")) 

#  Type F1 F2 
# 1 Apple 8 9 
# 2 Banana 15 7 
# 3 Orange 7 14 

где dat это имя вашего фрейма данных.

+0

Что делать, если у меня есть различное количество строк? В F1, три вида и F2, четыре вида. – BigDataScientist

+0

@ user2684128 См. Обновление. Теперь он работает, даже если существует различное количество строк. –

+0

Отлично! Большое спасибо – BigDataScientist

1

Эта проблема также может быть решена довольно легко с "reshape2" пакет:

library(reshape2) 

x <- melt(mydf, id.vars="Number") 
dcast(x, value ~ variable, value.var="Number", fun.aggregate=sum) 
# value F1 F2 
# 1 Apple 8 9 
# 2 Banana 15 7 
# 3 Orange 7 14 

Тем не менее, это также довольно легко захваченным с основанием R:

xtabs(Number ~ values + ind, 
     cbind(mydf["Number"], 
      stack(mydf[setdiff(names(mydf), "Number")]))) 
#   ind 
# values F1 F2 
# Apple 8 9 
# Banana 15 7 
# Orange 7 14 

В тех случаях, где ваши данные уже являются длинными, так как они находятся в your comment, это еще более прямолинейно:

xtabs(Number ~ Date + Type, mydf) 
#   Type 
# Date  M1 M2 
# 01/01/14 9 7 
# 01/02/14 8 6 
Смежные вопросы