按组

时间:2018-02-07 02:36:03

标签: r dataframe

我有不同城市的数据集和他们拥有的不同运动队:

**City**    **Basketball**  **Soccer**    **Tennis**    **Football**
   AA         Titans          Astros       Royals         Eagles
   AA         Crimson           NA         Falcons        Packers
   AA           NA            Phoenix      Tigers           NA
   AA         Goblins           NA         Lions            NA
   BB           NA              NA           NA             NA
   BB         Bears           Rockets      Broncos          NA
   CC         Pelicans        Wildfires    Panthers         NA
   CC           NA            Bobcats      Blizzard         NA
   CC           NA              NA         Tornadoes        NA
   CC           NA              NA         Hurricanes       NA

我想按城市对数据进行分组,并找到每个城市每个列的NA总数。我该怎么做呢?我在做了一些研究后试过这个

aggregate(df[,2:4], by=list(df$City), colSums(is.na(df)))

但它不起作用......

2 个答案:

答案 0 :(得分:1)

基地R是你的敌人。

data.table更友善:

library(data.table)
setDT(df) # <- convert to data.table
# going column-by-column, count NA
df[ , lapply(.SD, function(x) sum(is.na(x))), by = City]

有关详情,请参阅Getting Started with data.tableprimer on .SDthis on the use of lapply(.SD,...)

请注意,使用colSums需要将data.frame转换为matrix,这会强制所有列都具有相同的类(此处为character)如果他们不是,这可能是昂贵的。

答案 1 :(得分:0)

您的aggregate语法有点过时了。使用正确的自定义匿名函数,它应该工作:

aggregate(df[,2:4], by=list(df$City), FUN=function(x) { sum(is.na(x)) })

Demo