我输入的数据格式如下
val cond
1 A
1 B
4 C
1 A
2 A
1 B
我希望输出为
val cond occ
1 A 2 #1 occurs twice for A
1 B 2 #1 occurs twice for B
4 C 1 #4 occurs once for C
1 A 2 #1 occurs twice for A
2 A 1 #2 occurs once for A
1 B 2 #1 occurs twice for B
它的作用是计算第二列中值的值(第一列)的出现频率。必须有一个可以做到这一点的功能但我必须一直在寻找错误的方法。 我正在寻找避免循环的方法。
答案 0 :(得分:4)
基础R 您可以使用ave
df$occ <- ave(seq(nrow(df)), df$val, df$cond, FUN = length)
ave
的第一个参数是一个向量,最后一个参数(名为FUN
)应用于该向量的子集。子集由分组变量(介入的未命名参数df$val
和df$cond
)确定。
此处使用的向量seq(nrow(df))
只是一个计数器,如1..nrow(df)
(伪代码)。
data.table 除了dplyr
之外,这是另一个方便的包(在@ aosmith的回答中):
library(data.table)
setDT(df)
df[ , occ := .N, by=.(val, cond)]
希望语法是透明的。 .N
是子集中行数的特殊变量。
答案 1 :(得分:1)
如果dat
是数据集的名称,则可以使用包 dplyr 。类似的东西:
library(dplyr)
dat = dat %>%
group_by(val, cond) %>%
mutate(occ = n())
dat
Source: local data frame [6 x 3]
Groups: val, cond
val cond occ
1 1 A 2
2 1 B 2
3 4 C 1
4 1 A 2
5 2 A 1
6 1 B 2