簡體   English   中英

使用base :: table作為plyr :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM