根据列计算出现次数

时间:2015-09-04 01:41:51

标签: r

我输入的数据格式如下

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

它的作用是计算第二列中值的值(第一列)的出现频率。必须有一个可以做到这一点的功能但我必须一直在寻找错误的方法。 我正在寻找避免循环的方法。

2 个答案:

答案 0 :(得分:4)

基础R 您可以使用ave

df$occ <- ave(seq(nrow(df)), df$val, df$cond, FUN = length)

ave的第一个参数是一个向量,最后一个参数(名为FUN)应用于该向量的子集。子集由分组变量(介入的未命名参数df$valdf$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