3

鉴于我有一个df这样的数据框,其中包含列KeyUser.

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 中解决这个问题,有人知道吗?

4

2 回答 2

7

这是使用table,prop.table和的一种方法merge。假设您的 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
于 2013-04-17T13:22:12.450 回答
5

如果您的数据集被称为 dat 使用ave是一种方法:

## 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

稍微分解一下

这给出了按键的频率:

## + > 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"

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

编辑-per Ananda Mahto 评论:

如果您要获取实际值(可能是十进制),请使用与上述相同的形式,但最后一步是除法,而不是粘贴:

dat$Freq2 <- with(dat, ave(Key, Key, FUN=length))/ 
    with(dat, as.numeric(ave(as.character(User), User, FUN=length)))
于 2013-04-17T12:48:39.920 回答