创建等于另一列/因子频率的变量/列

时间:2015-08-07 19:16:03

标签: r

我有

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硬编码到函数中但是我所有的尝试都失败了。

非常感谢任何帮助。

3 个答案:

答案 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