在for循环中使用mutate时遇到问题
我正在尝试编写一个名为complete的函数,该函数使用一个文件目录,其中包含名为1-332的csv文件,并将该文件的标题作为一个数字,以打印出硫酸盐或硝酸盐列中不含NA的行数。我试图使用mutate添加一个名为nobs的列,如果两列都不是na,则返回1,然后将nobs的总和作为我的答案,但我收到一条错误消息,表示找不到对象nob。我怎样才能解决这个问题?正在讨论的特定文件目录在这段代码中下载在for循环中使用mutate时遇到问题,r,for-loop,mutate,R,For Loop,Mutate,我正在尝试编写一个名为complete的函数,该函数使用一个文件目录,其中包含名为1-332的csv文件,并将该文件的标题作为一个数字,以打印出硫酸盐或硝酸盐列中不含NA的行数。我试图使用mutate添加一个名为nobs的列,如果两列都不是na,则返回1,然后将nobs的总和作为我的答案,但我收到一条错误消息,表示找不到对象nob。我怎样才能解决这个问题?正在讨论的特定文件目录在这段代码中下载 library(tidyverse) if(!file.exists("rprog-data-spec
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)
}
错误:找不到对象“nob”
我认为下面的函数应该满足您的需要。我更喜欢在此设置中映射或应用,而不是循环。但是,如果没有错误消息或我可以在我的机器上运行的示例,很难说出代码哪里出错了 快乐编码, 丹尼尔 图书馆管理员 完成百分比选择两个感兴趣的列 tidyr::删除\u na%>%删除缺失的观察值 nrow获取没有丢失数据的行数 %>% sum所有文件中未丢失的行总数 }
我认为下面的函数应该满足您的需要。我更喜欢在此设置中映射或应用,而不是循环。但是,如果没有错误消息或我可以在我的机器上运行的示例,很难说出代码哪里出错了 快乐编码, 丹尼尔 图书馆管理员 完成百分比选择两个感兴趣的列 tidyr::删除\u na%>%删除缺失的观察值 nrow获取没有丢失数据的行数 %>% sum所有文件中未丢失的行总数 }
如上所述,避免在循环中构建对象。相反,考虑从每个CSV构建一个数据帧列表,然后调用RBIN一次。事实上,甚至考虑基础R,即,对于所有你的需要:
complete <- function(directory, id = 1:332){
# create a list of files
files_full <- list.files(directory, full.names = TRUE)
# create a list of data frames
df_list <- lapply(files_full[id], read.csv)
# build a single data frame with nob column
dat <- transform(do.call(rbind, df_list),
nob = ifelse(!is.na(sulfate) & !is.na(nitrate), 1, 0)
)
return(sum(dat$nob))
}
如上所述,避免在循环中构建对象。相反,考虑从每个CSV构建一个数据帧列表,然后调用RBIN一次。事实上,甚至考虑基础R,即,对于所有你的需要:
complete <- function(directory, id = 1:332){
# create a list of files
files_full <- list.files(directory, full.names = TRUE)
# create a list of data frames
df_list <- lapply(files_full[id], read.csv)
# build a single data frame with nob column
dat <- transform(do.call(rbind, df_list),
nob = ifelse(!is.na(sulfate) & !is.na(nitrate), 1, 0)
)
return(sum(dat$nob))
}
不要在for循环中调用rbind。它导致二次复制。请参阅。很抱歉没有明确说明错误消息是什么。它显示错误:运行completespecdata时未找到对象“nob”,1在这种情况下,rbind的更好替代方案是什么?变异行应该类似于dat添加dat,在for循环中从不调用rbind。它导致二次复制。请参阅。很抱歉没有明确说明错误消息是什么。它显示错误:当我运行completespecdata时未找到对象“nob”,1在这种情况下,有什么比rbind更好的替代方法?变异行应该类似于dat添加dat感谢示例!对于未来的问题,我应该如何更好地展示我的代码,以便在其他人的机器上创建一个可复制的示例?@nzhangh Great!如果您提供reprex,它将非常有用!此外,如果答案对您有效,您可以单击绿色复选标记,表示问题已被回答:@nzhanggh-不要将此作为您在Coursera R编程课程中的家庭作业答案提交,否则您将违反Coursera荣誉代码,该代码规定您不能将他人的作品作为自己的作品提交。@len greski别担心,我不会!谢谢你的例子!对于未来的问题,我应该如何更好地展示我的代码,以便在其他人的机器上创建一个可复制的示例?@nzhangh Great!如果您提供reprex,它将非常有用!此外,如果答案对您有效,您可以单击绿色复选标记,表示问题已被回答:@nzhanggh-不要将此作为您在Coursera R编程课程中的家庭作业答案提交,否则您将违反Coursera荣誉代码,该代码规定您不能将他人的作品作为自己的作品提交。@len greski别担心,我不会!