R按组计算元素的出现次数
R count occurrences of an element by groups
计算一个元素在向量中或 data.frame 在每个组中出现的最简单方法是什么?
我的意思不是只计算总数(正如其他 Whosebug 问题所问的那样),而是给每个连续出现的事件一个不同的数字。
例如这个简单的数据框:(但我将使用具有更多列的数据框)
mydata <- data.frame(A=c("A","A","A","B","B","A", "A"))
我找到了这个解决方案:
cbind(mydata,myorder=ave(rep(1,nrow(mydata)),mydata$A, FUN=cumsum))
结果如下:
A myorder
A 1
A 2
A 3
B 1
B 2
A 4
A 5
难道没有任何一个命令可以做到这一点吗?。或者使用专门的包?
我希望它稍后使用 tidyr 的 spread() 函数。
我的问题与
Is there an aggregate FUN option to count occurrences?
因为我不想知道最后出现的总数,而是每个元素的累计出现次数。
好的,我的问题有点复杂
mydata <- data.frame(group=c("x","x","x","x","y","y", "y"), letter=c("A","A","A","B","B","A", "A"))
我只知道解决我上面写的第一个例子。
但是,当我还需要第二个分组变量时会发生什么?
类似事件(字母)的分组。
group letter "occurencies within group"
x A 1
x A 2
x A 3
x B 1
y B 1
y A 1
y A 2
我已经找到方法
ave(rep(1,nrow(mydata)),list(mydata$group, mydata$letter), FUN=cumsum)
though it shoould be something easier.
使用data.table
library(data.table)
setDT(mydata)
mydata[, myorder := 1:.N, by = .(group, letter)]
by
参数使 table 在名为 A
的列的组内处理。 .N
是该组中的行数(如果 by
参数为空,它将是 table 中的行数),因此对于每个子 table ,每行的索引从 1 到该子 table.
中的行数
mydata
group letter myorder
1: x A 1
2: x A 2
3: x A 3
4: x B 1
5: y B 1
6: y A 1
7: y A 2
或几乎相同的dplyr
解决方案
mydata %>%
group_by(group, letter) %>%
mutate(myorder = 1:n())
计算一个元素在向量中或 data.frame 在每个组中出现的最简单方法是什么?
我的意思不是只计算总数(正如其他 Whosebug 问题所问的那样),而是给每个连续出现的事件一个不同的数字。
例如这个简单的数据框:(但我将使用具有更多列的数据框)
mydata <- data.frame(A=c("A","A","A","B","B","A", "A"))
我找到了这个解决方案:
cbind(mydata,myorder=ave(rep(1,nrow(mydata)),mydata$A, FUN=cumsum))
结果如下:
A myorder
A 1
A 2
A 3
B 1
B 2
A 4
A 5
难道没有任何一个命令可以做到这一点吗?。或者使用专门的包?
我希望它稍后使用 tidyr 的 spread() 函数。
我的问题与 Is there an aggregate FUN option to count occurrences? 因为我不想知道最后出现的总数,而是每个元素的累计出现次数。
好的,我的问题有点复杂
mydata <- data.frame(group=c("x","x","x","x","y","y", "y"), letter=c("A","A","A","B","B","A", "A"))
我只知道解决我上面写的第一个例子。 但是,当我还需要第二个分组变量时会发生什么? 类似事件(字母)的分组。
group letter "occurencies within group"
x A 1
x A 2
x A 3
x B 1
y B 1
y A 1
y A 2
我已经找到方法
ave(rep(1,nrow(mydata)),list(mydata$group, mydata$letter), FUN=cumsum)
though it shoould be something easier.
使用data.table
library(data.table)
setDT(mydata)
mydata[, myorder := 1:.N, by = .(group, letter)]
by
参数使 table 在名为 A
的列的组内处理。 .N
是该组中的行数(如果 by
参数为空,它将是 table 中的行数),因此对于每个子 table ,每行的索引从 1 到该子 table.
mydata
group letter myorder
1: x A 1
2: x A 2
3: x A 3
4: x B 1
5: y B 1
6: y A 1
7: y A 2
或几乎相同的dplyr
解决方案
mydata %>%
group_by(group, letter) %>%
mutate(myorder = 1:n())