/ /別の[重複]の数を含む列を追加する - r

別の[重複]の数を含む列を追加する - r

データフレームがあります df 次のようになります。 gender 列は factor 2つのレベル:

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 新しいカラムを実現するにはより良い方法がありますか?

回答:

回答№1の場合は3

あなたが試みてもよい 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))


回答№2については4

以来 gender 要因である場合、それを使用して table 出力:

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

または繰り返しを避けるために dat$ あまりにも多くの時間:

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

回答№3の場合は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

回答№4の場合は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

回答№5の場合は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つの要素しかないので価値がないかもしれません。