【发布时间】:2023-03-06 04:07:02
【问题描述】:
我正在尝试编写一个名为 complete 的函数,该函数采用文件目录(其中包含标题为 1-332 的 csv 文件)和文件标题作为数字打印出硫酸盐中没有 NA 的行数或硝酸盐柱。我正在尝试使用 mutate 添加一个标题为 nobs 的列,如果两个列都不是 na 则返回 1 ,然后将 nobs 的总和作为我的答案,但是我收到一条错误消息,指出找不到对象 nob。我怎样才能解决这个问题?有问题的特定文件目录在此代码块中下载。
library(tidyverse)
if(!file.exists("rprog-data-specdata.zip")) {
temp <- tempfile()
download.file("https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip",temp)
unzip(temp)
unlink(temp)
}
complete <- function(directory, id = 1:332){
#create a list of files
files_full <- list.files(directory, full.names = TRUE)
#create an empty data frame
dat <- data.frame()
for(i in id){
dat <- rbind(dat, read.csv(files_full[i]))
}
mutate(dat, nob = ifelse(!is.na(dat$sulfate) & !is.na(dat$nitrate), 1, 0))
x <- summarise(dat, sum = sum(nob))
return(x)
}
当运行以下代码时,nobs 应该是 117,但我收到一条错误消息
complete("specdata", 1)
错误:找不到对象“nob””
【问题讨论】:
-
永远不要在
for循环中调用rbind。它导致二次复制。见R Inferno - Circle 2: Growing Objects。 -
很抱歉没有说明错误信息是什么。当我运行 complete("specdata", 1) 时,它显示“错误:找不到对象 'nob'”
-
在这种情况下,有什么比 rbind 更好的选择?
-
mutate行应该类似于dat <- mutate(dat, ...,以便创建新列并可用于下一行。 -
添加 dat