好的,首先让我来定义我正在进行的项目以及我需要的结果。我有332个逗号分隔值文件的数据,这实际上是美国卫生部关于硝酸盐和硫酸盐污染物污染参数的统计数据。 332个实体的列表有332个ID,用于监控所有城市的污染情况,我必须对其进行一些分析。
所以数据表看起来像这样:
Date (yyyy-mm-dd) sulphate nitrate ID
xxxx-xx-01 some value some value 5
xxxx-xx-02 some value some value 5
所以监视器编号为5的每日数据。与332个ID的其余部分类似。
现在我的工作要求我编写一个函数,根据每个ID显示非NA值的数量。好?这意味着如果我指定ID 1,那么该函数将处理数据表并为我提供一个简单的数据框,其中包含该ID的ID号和非NA值的数量。
现在,我的当前函数执行事实方式,如果我只指定一个ID。但是当我指定ID的组合时,该函数为我提供了指定的所有ID的总和,这不是我想要的。
这是完整的功能:
complete <- function(directory, id = 1:332){
file.list <- list.files(directory, full.names = TRUE) ## list of files need to be read
pollutant.data <- data.frame() ## forming an empty data frame
for (i in 1:332){
pollutant.data <- rbind(pollutant.data, read.csv(files))} ## final data frame
ID <- pollutant.data[which(pollutant.data[,'ID'] %in% id),] ## for the id vector that needs to be specified in the function
good <- complete.cases(pollutant.data)
nobs <- sum(complete.cases(ID)) ## sum of complete data according to ID
return(data.frame(id, nobs = nobs))
}
现在,当我指定say,id = 1时,该函数会给我正确的结果。但是当我指定多个ID时,就像这样,c(3,6,4),它为我提供了所有三个ID的添加,每个行都有个人ID,这就是我无法解决。
现在,我认为我需要处理for循环以指定需要为每个ID找到总和,我尝试在良好和 nobs <之间插入for循环/ strong>矢量但我仍然得到错误的值。
答案 0 :(得分:0)
这条线是罪魁祸首:
ID <- pollutant.data[which(pollutant.data[,'ID'] %in% id),]
您要求的所有ID都与您传递的矢量相匹配,因此您绝不会按ID分隔。
更简单的方法是:
# Generate a mock dataset
test.data <- data.frame(ID = rep(1:5, each = 10), value = rnorm(50))
# Every 5th element is NA
test.data$value[seq(1, 50, 5)] <- NA
countComplete <- function(data.frame, id)
{
# Get only the subset of data we need (only requested id)
tmp <- subset(data.frame, ID %in% id)
# Split it by ID
tmp.split <- split(tmp, tmp$ID)
# Use sapply to count complete cases for the different IDs
res <- sapply(tmp.split, function(x){
sum(complete.cases(x))
})
# Return the result
res
}
例如:
countComplete(test.data, c(1,3))
返回
1 3
8 8