data.frame中不需要的行

时间:2015-03-16 20:40:01

标签: r

我想编写一个函数来检查一定数量的文件名 id .csv,这将返回没有NA s的行数。 这是我写的:

        complete <- function(directory, id) {
        setwd(directory)
        my_list <- list.files(getwd(), pattern="*.csv", full.names=TRUE)
        my_id <- numeric()
        my_output<-data.frame()
        my_count<-numeric()
        for(integer in id){
            my_data <- read.csv(my_list[integer])
            my_subset <- subset(my_data, sulfate !=0 & nitrate !=0)
            my_count[integer]<-length(my_subset[[1]])
            my_id[integer] <- integer
        }
        my_output<-cbind(my_id, my_count)
        my_output
    }
complete("/home/jpasquier/Téléchargements/specdata", c(1,3))

但结果如下:

> complete("/home/jpasquier/Téléchargements/specdata", c(1,3))
     my_id my_count
[1,]     1      117
[2,]    NA       NA
[3,]     3      243

所以我不明白为什么有一个不需要的行号2,毕竟在我的id参数中没有等于2的整数。 感谢。

1 个答案:

答案 0 :(得分:0)

你得到的是NA,因为你要为变量的第一和第三个值赋值,而第二个值则没有。

示例:

v <- vector()
v
#logical(0)
v[1] <- 111
v[3] <- 333

v
#[1] 111  NA 333

修改

这是一个工作示例,无需创建函数:

#create dummy csv
df1 <- data.frame(x=c(1,NA,2,0,4, 4),
                  y=c(1,3, 4,0,NA,6))
df2 <- data.frame(x=c(1,0,2,0, 4,0),
                  y=c(1,0,4,0,NA,0))

write.csv(df1,"id_1.csv",row.names = FALSE)
write.csv(df1,"id_2.csv",row.names = FALSE)
write.csv(df2,"id_3.csv",row.names = FALSE)
write.csv(df2,"id_4.csv",row.names = FALSE)

#choose which CSV
id <- c(1,3)

#get non zero counts
res <- lapply(lapply(list.files(pattern="^id.*.csv")[id],read.csv),
              function(i)nrow(subset(i,x!=0,y!=0)))

#update result names
names(res) <- list.files(pattern="^id.*.csv")[id]

#output result counts
res
# $id_1.csv
# [1] 4
# 
# $id_3.csv
# [1] 3