我有一些我想要过滤的数据(下载链接:http://spreadsheets.google.com/pub?key=0AkBd6lyS3EmpdFp2OENYMUVKWnY1dkJLRXAtYnI3UVE&output=xls)。我重新配置了数据,因此每个国家不是一行,而是每年一列,数据框的每一行都是国家年组合(即阿富汗,1960年,NA)。
既然我已经这样做了,我想创建一个初始数据的子集,排除任何有10年以上缺少避孕药使用数据的国家。
我曾想过在第二个数据框中创建一个唯一国家/地区名称列表,然后在该框架中添加一个变量,该变量包含每个国家/地区的行数,这些行具有避孕用途的NA(即对于阿富汗它会有46)。我的第一个想法(在VB.net中最流利)是使用for循环遍历各个国家,获取该国家的NA计数,然后用该值更新第二个数据框。
在那种情况下,我尝试了以下方法:
for(x in cl){
+ x$rc = nrow(subset(BCU, BCU$Country == x$Country))
+ }
在失败之后,Googling再次向我提出了一个问题(忘记抓住链接),建议使用by()
。基于此我试过:
by(cl, 1:nrow(cl), cl$rc <- nrow(subset(BCU, BCU$Country == cl$Country
& BCU$Contraceptive_Use == "NA")))
(cl
是列出国家/地区名称的第二个数据框,BCU
是最初的避孕用途数据框)
我对R很新(我工作的问题是关于Udacity的R课程),所以我会坦然承认这可能不是最好的方法,但我&#39 ;我仍然很好奇如何进行这种聚合。
答案 0 :(得分:1)
他们似乎都有> = 10年的数据缺失(除非我在某处错误估算):
library(tidyr)
library(dplyr)
dat <- read.csv("contraceptive use.csv", stringsAsFactors=FALSE, check.names=FALSE)
dat <- rename(gather(dat, year, value, -1),
country=`Contraceptive prevalence (% of women ages 15-49)`)
dat %>%
group_by(country) %>%
summarise(missing_count=sum(is.na(value))) %>%
arrange(desc(missing_count)) -> missing
sum(missing$missing_count >= 10)
## [1] 213
length(unique(dat$country))
## [1] 213