2013-11-28 64 views
2

我有一個數據幀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函數 - 還是有更好的方法來實現我的新列?

回答

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))

+0

我試過這個,它用NAs填充count列。運行命令後,我收到消息「有50個或更多警告(使用警告()查看前50個)」。警告如下所示:「在[< - 。factor'('* tmp *',i,value = 2L):無效因子水平,NAs生成」。我加倍檢查了專欄,這實際上是一個因素。 – whistler

+0

對不起,我應該更仔細地閱讀你的問題。如果你將'性別'轉換爲它的作品。我編輯我的問題。乾杯。 – Henrik

+0

你可以做'dat < - 轉換(dat,count = ave(age,gender,FUN = length))'而不必修改性別等級。 – flodel

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個因素。

+0

這是一個很好的解決方案,但對我來說並不實際。我以性別爲例,但我試圖計算的因素實際上已超過1000個級別。 – whistler

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

由於gender是一個因素,你可以用它來索引table輸出:

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

或者以避免重複dat$太多次:

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

很乾淨! +1! – Henrik