添加另一个计数的列

时间:2013-11-28 21:58:16

标签: r

我的数据框df如下所示gender列为factor,其中有两个级别:

gender    age
m         18
f         14
m         18
m         18
m         15
f         15

我想添加一个名为count的新列,它只反映gender级别在数据框中出现的次数。因此,最终,数据框看起来像:

gender    age    count
m         18     4
f         14     2
m         18     4
m         18     4
m         15     4
f         15     2

我知道我可以table(df$gender)向我提供因子出现的次数,但我不知道如何将这些结果转换为df中的新列。我想知道如何使用table函数 - 还是有更好的方法来实现我的新列?

5 个答案:

答案 0 :(得分:5)

您可以尝试ave

# first, convert 'gender' to class character
df$gender <- as.character(df$gender)

df$count <- as.numeric(ave(df$gender, df$gender, FUN = length))
df
#   gender age count
# 1      m  18     4
# 2      f  14     2
# 3      m  18     4
# 4      m  18     4
# 5      m  15     4
# 6      f  15     2

更新以下@ flodel的评论 - 谢谢!

df <- transform(df, count = ave(age, gender, FUN = length))

答案 1 :(得分:4)

由于gender是一个因素,您可以使用它来索引table输出:

dat$count <- table(dat$gender)[dat$gender]

或者避免重复dat$次数:

dat <- transform(dat, count = table(gender)[gender])

答案 2 :(得分:1)

使用plyr

library(plyr) 
ddply(dat,.(gender),transform,count=length(age))
  gender age count
1      f  14     2
2      f  15     2
3      m  18     4
4      m  18     4
5      m  18     4
6      m  15     4

答案 3 :(得分:1)

还有一个data.table版本。

library(data.table)
df <- as.data.table(df)

一旦你拥有了data.table,那就是一个简单的操作:

df[,count := .N,by="gender"]
df

#   gender age count
#1:      m  18     4
#2:      f  14     2
#3:      m  18     4
#4:      m  18     4
#5:      m  15     4
#6:      f  15     2

答案 4 :(得分:0)

您可以设置计数然后执行类似的操作,但这并不完全优雅。

m.cnt <- length(which(df$gender == "m"))
f.cnt <- length(which(df$gender == "f"))

df$count <- NA
df$count[which(df$gender == "m")] <- m.cnt
df$count[which(df$gender == "f")] <- f.cnt

或者你可以使用plyr,但这会导致一遍又一遍地重新计算同样的事情,这可能不值得,因为你只有2个因素。