我的数据框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
函数 - 还是有更好的方法来实现我的新列?
答案 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个因素。