Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在for循环中使用mutate时遇到问题_R_For Loop_Mutate - Fatal编程技术网

在for循环中使用mutate时遇到问题

在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

我正在尝试编写一个名为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)
}
错误:找不到对象“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别担心,我不会!