组中键的频率

dee*_*mel 3 r frequency

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

Key  User  
1   Bob  
2   Tobi  
1   Bob  
3   Bob  
4   Bob  
5   Bob  
6   Tobi  
5   Bob
Run Code Online (Sandbox Code Playgroud)

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

A5C*_*2T1 7

下面是使用一种方法table,prop.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
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 5

如果您的数据集被称为dat using 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
Run Code Online (Sandbox Code Playgroud)

分解一下

这通过Key给出了频率:

## + > with(dat, ave(Key, Key, FUN=length))
## [1] 2 1 2 1 1 2 1 2
Run Code Online (Sandbox Code Playgroud)

这给了用户的分母频率(虽然你的一个是2,我不确定我是否遗漏了一些东西):

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

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

编辑-Ananda Mahto评论:

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

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