组中键的频率

时间:2013-04-17 12:41:22

标签: r frequency

鉴于我有一个包含dfKey列的数据框User

Key  User  
1   Bob  
2   Tobi  
1   Bob  
3   Bob  
4   Bob  
5   Bob  
6   Tobi  
5   Bob

我想创建一个新列,其值的计算如下:

  

此行的频率键数据集/用户的行数   等于此行中的用户

在此示例中显示,它看起来像这样:

Key  User  Freq
1   Bob    2/6
2   Tobi   1/2
1   Bob    2/6
3   Bob    1/6
4   Bob    1/6
5   Bob    2/6
6   Tobi   1/2
5   Bob    2/6

我不太确定如何在R中解决这个问题,有没有人有想法?

2 个答案:

答案 0 :(得分:7)

以下是使用tableprop.tablemerge的一种方法。假设您的data.frame被称为“mydf”:

> merge(mydf, as.data.frame(prop.table(table(mydf), margin = 2)))
  Key User      Freq
1   1  Bob 0.3333333
2   1  Bob 0.3333333
3   2 Tobi 0.5000000
4   3  Bob 0.1666667
5   4  Bob 0.1666667
6   5  Bob 0.3333333
7   5  Bob 0.3333333
8   6 Tobi 0.5000000

答案 1 :(得分:5)

如果使用ave将数据集称为dat,则可采用以下方法之一:

## dat <- read.table(text="Key  User  
## 1   Bob  
## 2   Tobi  
## 1   Bob  
## 3   Bob  
## 4   Bob  
## 5   Bob  
## 6   Tobi  
## 5   Bob", header=TRUE)

dat$Freq <- paste(with(dat, ave(Key, Key, FUN=length)), 
    with(dat, ave(as.character(User), User, FUN=length)), sep="/")

##   Key User Freq
## 1   1  Bob  2/6
## 2   2 Tobi  1/2
## 3   1  Bob  2/6
## 4   3  Bob  1/6
## 5   4  Bob  1/6
## 6   5  Bob  2/6
## 7   6 Tobi  1/2
## 8   5  Bob  2/6

稍微分解

这通过Key给出了频率:

## + > with(dat, ave(Key, Key, FUN=length))
## [1] 2 1 2 1 1 2 1 2

这给了用户的分母频率(虽然你的一个是2,我不确定我是否错过了什么):

## > with(dat, ave(as.character(User), User, FUN=length))
## [1] "6" "2" "6" "6" "6" "6" "2" "6"

然后我将两者粘贴在一起。

编辑-Ananda Mahto评论:

如果您在实际值之后(可能是小数),请使用与上面相同的形式,但是将分割作为最后一步而不是粘贴:

dat$Freq2 <- with(dat, ave(Key, Key, FUN=length))/ 
    with(dat, as.numeric(ave(as.character(User), User, FUN=length)))