2015-03-16 3 views
1

Я хочу написать функцию, которая проверяет определенное количество файлов, имя id .csv, и это вернет число строк без NA s. Вот что я написал:Нежелательные строки в data.frame

 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 

Так что я не понимаю, почему есть нежелательная ряд number2, ведь не существует целое, равным 2 в моем аргументе id. Спасибо.

+0

Не изобретайте колесо, смотрите в [ complete.cases] (https://stat.ethz.ch/R-manual/R-patched/library/stats/html/complete.cases.html) – zx8754

+1

Я не вижу, где вы думаете, что подсчитываете количество строк без NA. @ zx8754 часто нужно изобретать колесо, чтобы учиться чему-то – rawr

+0

Согласитесь, «узнайте вещи», функция называется 'complete', которая проверяет, являются ли 2 переменные не нулями ... – zx8754

ответ

0

Вы получаете NA s, потому что присваиваете значения 1-му и 3-му значениям переменной, и ничего для 2-го.

Пример:

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

v 
#[1] 111 NA 333 

EDIT:

Вот рабочий пример, нет необходимости создавать функцию:

#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 
+0

благодаря @ zx8754. Я просто добавил новый счетчик, и теперь у меня ожидаемое поведение. Благодарю. complete <- function(directory, id) { \t setwd(directory) \t my_list <- list.files(getwd(), pattern="*.csv", full.names=TRUE) \t my_id <- numeric() \t my_output<-data.frame() \t my_count<-numeric() \t i<-1 \t for(x in id){ \t \t my_data <- read.csv(my_list[x]) \t \t my_subset <- subset(my_data, sulfate !=0 & nitrate !=0) \t \t my_count[i]<-length(my_subset[[1]]) \t \t my_id[i] <- x \t \t i<-i+1 \t } \t my_output<-cbind(my_id, my_count) \t my_output } complete("/home/jpasquier/Téléchargements/specdata", c(1,2,3,5)) jgrec

Смежные вопросы