短
我有
X <- data.frame(Animal = c("Ant", "Cat", "Dog", "Ant", "Dog", "Ant", "Ant"))
我想创建一个freq
列到X
,以便
> X
Animal Freq
1 Ant 4
2 Cat 1
3 Dog 2
4 Ant 4
5 Dog 2
6 Ant 4
7 Ant 4
长
我有
> X <- data.frame(Animal = c("Ant", "Cat", "Dog", "Ant", "Dog", "Ant", "Ant"))
> X
Animal
1 Ant
2 Cat
3 Dog
4 Ant
5 Dog
6 Ant
7 Ant
我知道
> table(X)
X
Ant Cat Dog
4 1 2
或者
> count(X)
Animal freq
1 Ant 4
2 Cat 1
3 Dog 2
那个
> subset(count(X), Animal == "Ant")$freq
[1] 4
甚至那个
> subset(count(X), Animal == X[1,1])$freq
[1] 4
> subset(count(X), Animal == X[2,1])$freq
[1] 1
但我正在努力将所有内容添加到freq
X
,以便
> X
Animal Freq
1 Ant 4
2 Cat 1
3 Dog 2
4 Ant 4
5 Dog 2
6 Ant 4
7 Ant 4
我怀疑该建议将以某种方式使用,但我甚至无法使该功能正常工作。我可以得到以下工作
> fn.freq <- function(FreqTable, Variable){
+ return(subset(FreqTable, Animal == Variable)$freq)
+ }
> fn.freq(count(X),X[1,1])
[1]
但是当我真的希望它是动态/函数变量时,这仍然有Animal
硬编码到函数中但是我所有的尝试都失败了。
非常感谢任何帮助。
答案 0 :(得分:3)
您可以使用ave
:
X <- transform(X, freq = ave(as.integer(Animal), Animal, FUN = length))
# Animal freq
# 1 Ant 4
# 2 Cat 1
# 3 Dog 2
# 4 Ant 4
# 5 Dog 2
# 6 Ant 4
# 7 Ant 4
答案 1 :(得分:2)
正如我之前的评论:使用dplyr
library(dplyr)
X %>% group_by(Animal) %>% mutate(freq = n())
Source: local data frame [7 x 2]
Groups: Animal
Animal freq
1 Ant 4
2 Cat 1
3 Dog 2
4 Ant 4
5 Dog 2
6 Ant 4
7 Ant 4
%>%
是&#34;管道运算符&#34;,它是在magrittr包中开发的,其工作原理f(x)
与{{1}相同} {其中x %>% f()
是一个R函数,如f
或类似mean
等等......只是一个R函数)。
它只是一个更简洁易读的代码工具,通常只是个人选择。它由dplyr使用,但您也可以与其他包和基础R一起使用。
我的代码只做了两件事:1)它将每个mutate
的数据分成不同的组,然后创建(Animal
)一个名为{{1}的新列只使用Mutate
函数(在freq
中实现)基本上计算每个组的元素。
答案 2 :(得分:1)
其他解决方案:
merge(X, table(X$Animal), by.x = "Animal", by.y = "Var1")
# In descending order by frequency
Animal Freq
1 Ant 4
2 Ant 4
3 Ant 4
4 Ant 4
5 Cat 1
6 Dog 2
7 Dog 2
使用sqldf:
library(sqldf)
sqldf("SELECT * FROM X
LEFT JOIN (SELECT Animal, COUNT(*) AS Freq FROM X GROUP BY Animal)
USING (Animal)")
Animal Freq
1 Ant 4
2 Cat 1
3 Dog 2
4 Ant 4
5 Dog 2
6 Ant 4
7 Ant 4