鉴于我有一个包含df
和Key
列的数据框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中解决这个问题,有没有人有想法?
答案 0 :(得分: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
答案 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)))