我想编写一个函数来检查一定数量的文件名 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的整数。 感谢。
答案 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