我有一个名为mydata的数组。列标题是c(“name”,“ID”,“Stuff_A”,“Stuff_B”)。 “name”是一个字符串,“ID”是归属于每个“name”的数字,“Stuff_A”和“Stuff_B”只是我想要求和的数值。如果我使用,
骨料(〜ID +名称,MYDATA,总和)
我得到了我几乎想要的东西。对于具有相同名称和ID的值,将“Stuff_A”和“Stuff_B”相加。但是,我还想在聚合数据中创建一个新列,告诉我找到了每个名称的实例数。有什么想法吗?
编辑:我的意思是将Stuff_A列加在一起,每个对应名称的Stuff_B相同。抱歉。这是一些数据。
a = c(2, 3, 5, 4, 11, 6)
s = c("A. Sphere", "A. Square", "A. Line", "A. Square","A. Sphere", "A. Square")
e = c(1111,1112,1113,1112,1111,1112)
b = c(1, 8, 2, 0, 8, 1)
df = data.frame(s,e, a, b)
colnames(df)<-c("name","id","Stuff_A","Stuff_B")
sumdf<-aggregate(.~name+id,df,sum)
最后一行几乎完成了我想要它做的事情,但我希望第五列有每个名字出现的次数。因此,对于我在这里的模拟数据,我们将在A. Sphere旁边有2个,在A. Square旁边有3个,在A. Line旁边有1个。
编辑2:我确实找到了一个愚蠢的方式。我刚刚在aggregate命令之前创建了一个新列,它复制了names列,重命名了新名称列name_count,并按原样运行了aggregate命令。这很有效。
答案 0 :(得分:0)
使用库dplyr
你可以尝试这样的事情:
library(dplyr)
df %>% group_by(name, id) %>% summarise(sumOfStuffA = sum(Stuff_A), sumOfStuffB = sum(Stuff_B), nObservations = n())
输出如下:
Source: local data frame [3 x 5]
Groups: name [?]
name id sumOfStuffA sumOfStuffB nObservations
(fctr) (dbl) (dbl) (dbl) (int)
1 A. Line 1113 5 2 1
2 A. Sphere 1111 13 9 2
3 A. Square 1112 13 9 3