在另一列中填充一列具有唯一值的频率

时间:2016-10-04 06:38:46

标签: r

我想创建一个新的frequency列,并在其中填入item中每个唯一值的总计数。我试过了:

df$frequency <- sum(df$item) #gives me total sum
df$frequency <- sum(unique(df$item)) # gives me 6 for some reason
df$frequency <- sum(df$item == 1) #gives me total count per selected value

但我真的想立刻生成它们。

示例数据:

> df <- data.frame("item" = c(1,1,1,1,2,2,2,3))
> df
  item
1    1
2    1
3    1
4    1
5    2
6    2
7    2
8    3

期望的输出:

> df
  item frequency
1    1         4
2    1         4
3    1         4
4    1         4
5    2         3
6    2         3
7    2         3
8    3         1

提前多多谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用table

df$frequency <- table(df$item)[df$item]

#   item frequency
#1    1         4
#2    1         4
#3    1         4
#4    1         4
#5    2         3
#6    2         3
#7    2         3
#8    3         1

ave

df$frequency <- ave(1:nrow(df), df$item, FUN = length)

答案 1 :(得分:1)

您可以尝试使用data.table:按照frequency创建与项目总数相对应的列item

library(data.table)
setDT(df)[, frequency:=.N, by=item]
df
#   item frequency
#1:    1         4
#2:    1         4
#3:    1         4
#4:    1         4
#5:    2         3
#6:    2         3
#7:    2         3
#8:    3         1

答案 2 :(得分:0)

你想要这样的东西吗?

df <- data.frame("item" = c(2,2, 1,1,1,1,2,2,2,3))
df <- data.frame(item=df[order(df$item),]) # if items are not ordered
df$frequency <- as.integer(rep(table(df), table(df)))
df
    item frequency
1     1         4
2     1         4
3     1         4
4     1         4
5     2         5
6     2         5
7     2         5
8     2         5
9     2         5
10    3         1