鉴于我有一个df像这样的数据框包含列Key和User.
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中解决这个问题,有没有人有想法?
下面是使用一种方法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
Run Code Online (Sandbox Code Playgroud)
如果您的数据集被称为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)