【问题标题】:Error feeding value to read.csv: Must be character string将值输入到 read.csv 时出错:必须是字符串
【发布时间】:2014-05-16 19:57:31
【问题描述】:

我有一个函数定义一个目录和一个要加载和分析的文件。 该函数正在读取这些值,但是当被read.csv 调用时,它似乎无法识别文件名。我认为这是格式的问题,但我不知道。除了 dt Selectdata 从未创建 Selectdata<-read.csv(z, header=TRUE) 之外,一切似乎都在做它应该做的事情。 z 是一个包含要加载的文件名的向量。

调试时这是生成的错误:

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  'file' must be a character string or connection

由于错误表示正在读取的值不是字符、字符串或连接,我厌倦了设置它as.character 等但无济于事。它一定是我缺少的更简单的东西。

运行时:

Warning message:
In mean.default(Selectdata$polutant, na.rm = TRUE) :
  argument is not numeric or logical: returning NA

但是,实际上,Selectdata 从未被创建(因此,尝试了均值,但显然没有任何价值)

testfun <- function(directory, polutant, id) {

    setwd(directory)         
    x <- polutant     # not needed just checking to see if polutant has been read  
    print(x)          # not needed just checking  

    y <- list.files(directory, full.names=TRUE)

    print(y[id])      # not needed just checking
    z <- y[id]

    if (length(id == 1)) {
        Selectdata <- read.csv(z, header = TRUE)
    }
    mean(Selectdata$polutant, na.rm=TRUE) 
}  

【问题讨论】:

  • 那么您的print(y[id]) 行中打印的是什么? (不过还有更多错误)
  • 如果您在堆栈溢出中搜索“[r] 污染物”,您可以看到您的同学提出的所有问题并使用其中一些答案。
  • 谢谢 MrFlick - 感谢您对我们的入侵。我希望有一天我能回报您的青睐

标签: r csv


【解决方案1】:

您的代码中有几个错误,不一定与您的错误消息有关。不过,让我们轮流看,结果可能会很明显错误在哪里:

x <- polutant     # not needed just checking to see if polutant has been read  
print(x)          # not needed just checking  

不是错误,但不需要将polutant 分配给另一个变量。直接print就行了。

y <- list.files(directory, full.names=TRUE)

您将directory 指定为目录,但您已经将chdir 转换为directory。所以现在你正在寻找directory/directory。因此,您可能找不到您的文件。

由于chdir 在函数之外有一个可观察到的副作用,所以无论如何使用它都不是一个好主意。删除它。

print(y[id])      # not needed just checking

这打印什么?可能是 NULL - 这会导致错误消息。

if (length(id == 1)) {

首先你比较id1然后你检查它的长度是否不等于0(if (some_number)是@的一个草率的快捷方式987654336@)。你想写的是if (length(id) == 1)

mean(Selectdata$polutant, na.rm=TRUE) 

这里有两个错误。首先,您不能在定义的范围之外访问SelectData(即在if 内)。其次,这将尝试访问数据框中名为polutant 的列。您可能想要访问具有存储在变量polutant 中的名称的列。您不能为此使用 $ 语法,您需要使用 Selectdata[[polutant]]Selectdata[, polutant]

这给我们留下了:

testfun <- function(directory, polutant, id) {
    filenames <- list.files(directory, full.names = TRUE)

    if (length(id) == 1) {
        filename <- filenames[id]
        selectdata <- read.csv(filename, header = TRUE)
        mean(selectdata[, polutant], na.rm = TRUE)
    }
}

(我冒昧地统一了变量命名和格式约定,并使用了更具描述性的变量名称。)

另外,请注意list.files 以未指定的顺序返回文件名,并且可能会更改顺序,因此您无法有意义地使用固定的id 来加载给定文件。

【讨论】:

  • 看起来两个重要的问题确实是:1) (length(id) == 1),我把括号放在了错误的位置,所以它跳过了整个“if”语句 2) mean(selectdata[, polutant], na.rm = TRUE) 语法和 3) 在“if”之外定义。您的代码有效。感谢您的帮助:我为虚假代码道歉,我正在投入一些东西以尝试查看代码在哪里工作以及它是否失败。下次我会清理得更好。非常感谢您的帮助。
【解决方案2】:

根据您提供的代码,z 似乎不太可能是具有文件名的字符向量以外的任何内容。您确定这正是您所运行的并且是您得到的确切错误吗?

您仅在if 语句中创建的对象在该块存在后消失。例如

> if(1==2) {
+     a<-"ok"
+ }
> a;
Error: object 'a' not found

为什么不将mean(Selectdata$polutant, na.rm=TRUE) 也放在if 语句中?

【讨论】:

  • 谢谢,是的,这就是我没有意识到 {} 的事情。我把平均值放在试图处理问题的两个部分之外:哪里有一个文件或多个文件被附加在一起在多个文件中,对它们进行 rbind 并执行均值函数。我将在 if/else 的两个部分中都写下平均线。再次感谢。
【解决方案3】:

我昨天在试验,想出了一个我认为效果很好的方法。它使用dir 而不是将路径与pastelist.files 一起粘贴到文件中。由于我从未见过dir 自己使用过或使用过它,因此我无法告诉您它的性能是否比将文件名粘贴在一起更好,但它似乎适用于这个示例。

结果是计算的列、平均值和列均值的列表。我这样做是为了显示函数中正在计算的内容。它可以很容易地更改为仅输出所有列的平均值。

功能:

multifile.means <- function(directory = getwd(), pollutant, id = NULL)
{
  d <- match.arg(directory, list.files())
  cn <- match.arg(pollutant,  c('sulfate', 'nitrate'))
  ## list the full file paths in the given 'directory'
  p <- dir(d, full.names = TRUE)
  ## subset 'p' based on 'id' values
  if(!is.null(id)){ id <- id[!id > length(p)];  p <- p[id] }
  ## read, store, and name the relevant columns
  cl <- sapply(p, function(x){ read.csv(x)[,cn] }, USE.NAMES = FALSE)
  colnames(cl) <- basename(p)
  ## return a named list of results
  list(values = cl, 
       mean = mean(cl, na.rm = TRUE), 
       colMeans = colMeans(cl, na.rm = TRUE))
}

结果(默认ID = NULL,意思是计算目录下的所有文件):

> multifile.means('testDir', 'sulfate')
$values
      001.csv 057.csv 146.csv 213.csv
 [1,]       2       2       5       1
 [2,]       9       4       4       4
 [3,]       6       9       5       7
 [4,]      10       2       5       4
 [5,]       9       9      NA      NA
 [6,]      10       6       2       5
 [7,]       4       4       2      NA
 [8,]       5       4       7       4
 [9,]       3       9       1       8
[10,]       4       2       1       2

$mean
[1] 4.864865

$colMeans
 001.csv  057.csv  146.csv  213.csv 
6.200000 5.100000 3.555556 4.375000

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 2018-08-21
    • 1970-01-01
    • 2023-03-12
    • 2019-03-09
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多