![](/img/trans.png)
[英]Applying a custom function on data.table instead of using plyr and ddply
[英]Using base::table as argument of plyr::ddply
不知道如何通過匯總我的國家/地區性別計數來在這里馴化ddply
。 我有這個數據框
df <- data.frame(country = c("Italy", "Germany", "Italy", "USA","Poland"),
gender = c("male", "female", "male", "female", "female"))
我想要一個數據框,其中每一行都詳細說明每個國家/地區有多少男性和女性。 然而
ddply(df,~country,table)
country female male
1 Germany 1 0
2 Germany 0 0
3 Germany 0 0
4 Germany 0 0
5 Italy 0 0
6 Italy 0 2
7 Italy 0 0
8 Italy 0 0
9 Poland 0 0
10 Poland 0 0
11 Poland 1 0
12 Poland 0 0
13 USA 0 0
14 USA 0 0
15 USA 0 0
16 USA 1 0
盡管它產生了預期的結果,但也為每個組增加了三行。 為什么?
我找到了這個解決方案。 不確定是最優雅的。
df <- data.frame(country = c("Italy", "Germany", "Italy", "USA","Poland"),
gender = c("male", "female", "male", "female", NA))
ddply(df, .(country), summarise,
female=sum(gender=="female",na.rm = TRUE),
male=sum(gender=="male", na.rm = TRUE),
na=sum(is.na(gender)))
看起來您只是想要
as.data.frame.matrix(table(df))
由於: 如何將表轉換為數據框
但是要回答有關為什么得到輸出的問題,您...
table
基於因子水平,而不是向量中的值。 所以如果你跑
df[df$country=="Germany",]$country
[1] Germany
Levels: Germany Italy Poland USA
您可以看到,子集化后,國家/地區向量仍然具有所有四個級別,但只有一個值。 然后,當您運行table
時,即使它們不在向量table
,它也會為每個級別進行匯總。
table(df[df$country=="Germany",])
gender
country female male
Germany 1 0
Italy 0 0
Poland 0 0
USA 0 0
調試ddply
,請始終在將根據數據創建的子集之一上試用功能。
既然您已經在plyr
,為什么不使用count
函數呢?
> library(plyr)
> count(df)
# country gender freq
# 1 Germany female 1
# 2 Italy male 2
# 3 Poland female 1
# 4 USA female 1
或在底數R中的table
> ( tb <- table(df) )
# gender
# country female male
# Germany 1 0
# Italy 0 2
# Poland 1 0
# USA 1 0
添加 :根據下面的OP注釋,要將上表轉換為數據框,您可以操縱,使用和更改其屬性。
> as.data.frame(cbind(country = rownames(tb), unclass(tb)),
row.names = "NULL")
# country female male
# 1 Germany 1 0
# 2 Italy 0 2
# 3 Poland 1 0
# 4 USA 1 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.