为数据帧inR指定列名时出错

为数据帧inR指定列名时出错,r,dataframe,R,Dataframe,我运行以下代码以打开一组CSV文件,其中包含温度和时间数据 temp = list.files(pattern="*.csv") for (i in 1:length(temp)) { assign(temp[i], read.csv(temp[i], header=FALSE, skip =20)) colnames(as.data.frame(temp[i])) <- c("Date","Unit","Temp") } 我正在尝试分配列名,但收到以下错误消息: Error

我运行以下代码以打开一组CSV文件,其中包含温度和时间数据

temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) 
{
  assign(temp[i], read.csv(temp[i], header=FALSE, skip =20))
  colnames(as.data.frame(temp[i])) <- c("Date","Unit","Temp")
}
我正在尝试分配列名,但收到以下错误消息:

Error in `colnames<-`(`*tmp*`, value = c("Date", "Unit", "Temp")) : 
  'names' attribute [3] must be the same length as the vector [1]

colnames中的错误我会采取稍微不同的方法,这可能更容易理解:

temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) 
{
  tmp <- read.csv(temp[i], header=FALSE, skip =20)
  colnames(tmp) <- c("Date","Unit","Temp")
  # Now what do you want to do?
  # For instance, use the file name as the name of a list element containing the data?
}

将创建多页pdf。祝你好运

我会采取稍微不同的方法,这可能更容易理解:

temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) 
{
  tmp <- read.csv(temp[i], header=FALSE, skip =20)
  colnames(tmp) <- c("Date","Unit","Temp")
  # Now what do you want to do?
  # For instance, use the file name as the name of a list element containing the data?
}

将创建多页pdf。祝你好运

乍一看,在临时列表的元素周围似乎缺少一组大括号,
[]
。您的属性列表有三个元素,但由于您使用的是
temp[i]
而不是
temp[[i]]
,因此for循环实际上没有访问列表中的元素,因此将其视为长度为1的元素,正如错误所述。

乍看之下,似乎缺少一组大括号集,
[]
,围绕临时列表中的元素。您的属性列表有三个元素,但由于您使用的是
temp[i]
而不是
temp[[i]]
for循环实际上没有访问列表中的元素,因此正如错误所说,它被视为长度为1的元素。

通常不建议在R中使用'assign'语句。(我真的应该找到一些关于为什么会这样的资源。)

您可以使用以下函数来完成您正在尝试的操作:

                   V1 V2   V3
1 6/30/13 10:00:01 AM  C 32.5
2 6/30/13 10:20:01 AM  C 32.5
3 6/30/13 10:40:01 AM  C 33.5
4 6/30/13 11:00:01 AM  C 34.5
5 6/30/13 11:20:01 AM  C 37.0
6 6/30/13 11:40:01 AM  C 35.5
read.a.file <- function (f, cnames, ...) {
  my.df <- read.csv(f, ...)
  colnames(my.df) <- cnames
  ## Here you can add more preprocessing of your files.
}

通常不建议在R中使用'assign'语句(我应该找到一些关于为什么会这样的参考资料)

您可以使用以下函数来完成您正在尝试的操作:

                   V1 V2   V3
1 6/30/13 10:00:01 AM  C 32.5
2 6/30/13 10:20:01 AM  C 32.5
3 6/30/13 10:40:01 AM  C 33.5
4 6/30/13 11:00:01 AM  C 34.5
5 6/30/13 11:20:01 AM  C 37.0
6 6/30/13 11:40:01 AM  C 35.5
read.a.file <- function (f, cnames, ...) {
  my.df <- read.csv(f, ...)
  colnames(my.df) <- cnames
  ## Here you can add more preprocessing of your files.
}
  • “read.csv”返回一个data.frame,因此您不需要“as.data.frame”调用
  • 您可以使用“col.names”参数“read.csv”来指定列名
  • 我不知道您使用的是哪个版本的R,但是“colnames(as.data.frame(…)
  • “read.csv”返回一个data.frame,因此您不需要“as.data.frame”调用
  • 您可以使用“col.names”参数“read.csv”来指定列名

  • 我不知道您使用的是什么版本的R,但是“colnames(as.data.frame(…)下面是解决您的问题的短期方法,但是您确实需要阅读更多关于使用
    R
    的内容,正如您在上面所做的那样,我希望您会很快陷入另一个混乱。可能从从不使用
    assign
    开始

    lapply(list.files(pattern = "*.csv"), function (f) {
      df = read.csv(f, header = F, skip = 20))
      names(df) = c('Date', 'Unit', 'Temp')
      df
    }) -> your_list_of_data.frames
    
    尽管您更可能希望这样做(编辑以保留文件名信息):


    下面是一个短期解决问题的方法,但是你确实需要阅读更多关于使用
    R
    的内容,正如你在上面所做的那样,我预计你会很快陷入另一个困境。也许从永远不要使用
    assign
    开始

    lapply(list.files(pattern = "*.csv"), function (f) {
      df = read.csv(f, header = F, skip = 20))
      names(df) = c('Date', 'Unit', 'Temp')
      df
    }) -> your_list_of_data.frames
    
    尽管您更可能希望这样做(编辑以保留文件名信息):


    colnames
    命令中调用
    temp[i]
    时,看起来
    temp[i]
    引用的是字符对象,而不是您创建的变量!如果我没有记错,那么您必须使用
    get(temp[i])
    调用名为
    temp[i]的变量
    指的是字符对象。当您在
    colnames
    命令中调用
    temp[i]
    时,看起来
    temp[i]
    指的是字符对象,而不是您创建的变量!如果我没有记错,您就必须使用
    get(temp[i])
    调用名为
    temp[i]的变量
    指的是。这不是要通过tmp为他们拥有的每个csv重写吗?我想他们想为每个csv创建一个对象。当然。我假设OP可能想在他们前进的过程中
    cbind
    他们,但我不想试着读懂他们的心思。这很好,谢谢!但是的,我每次都需要创建一个新对象。如何是否使用cbind?我对R非常陌生,不熟悉基本功能,但我认为关键是您希望最终数据的结构如何?因为文件中没有站点信息,我猜您希望使用文件名作为某种标识符,并将所有数据收集到一个大的部分。选择可能取决于您的方式计划绘制此信息。总体而言,我正在尝试上载一组CSV文件,这些文件的数据格式如上所示(跳过是必要的,因为每个文件的前20行只是一个标题),然后覆盖时间与温度的图表,并找到一个基本趋势。因此我认为最好将每个CSV作为其自己的数据帧。这是否回答了您的问题?这不是要通过tmp为他们拥有的每个CSV重写吗?我想他们想为每个CSV创建一个对象。当然。我假设OP可能想要
    cbind
    随他们去,但我不想试着读懂他们的想法。这很好,谢谢!但是,是的,我每次都需要创建一个新对象。cbind是如何使用的?我对R非常陌生,对基本功能仍然不熟悉。我想关键是您希望最终数据的结构如何?因为文件中没有站点信息,我想这意味着您希望使用文件名作为某种标识符,并将所有数据收集到一大块中。选择可能取决于您计划如何绘制此信息。总体而言,我正在尝试上载一组CSV文件,这些文件的数据格式如上所示(跳过是必要的,因为每个文件的前20行只是一个标题),然后覆盖时间与温度的图表,并找到潜在的趋势。因此,我认为最好将每个CSV作为其自己的数据帧。这是否回答了您的问题?list.files应创建一个字符向量而不是list.list.files应创建一个字符向量而不是列表。为了完整性,让我们链接回问题n您刚才问,此处的OP可能会发现有用。为了完整性,让我们回到您刚才问的问题,此处的OP可能会发现有用。
    lapply(list.files(pattern = "*.csv"), function (f) {
      df = read.csv(f, header = F, skip = 20))
      names(df) = c('Date', 'Unit', 'Temp')
      df
    }) -> your_list_of_data.frames
    
    df = do.call(rbind,
                 lapply(list.files(pattern = "*.csv"), function(f)
                        cbind(f, read.csv(f, header = F, skip = 20))))
    names(df) = c('Filename', 'Date', 'Unit', 'Temp')