【问题标题】:R: How to get to data frame which is stored in vector?R:如何获取存储在向量中的数据框?
【发布时间】:2020-03-22 18:41:56
【问题描述】:

我有 20 个 csv 文件需要上传 我做了一个循环,然后将每个 data.frame 添加到一个向量中。 最后,在向量“list_df”中,我有 20 个元素,我在其中存储了 20 个数据帧的名称。

现在我正在尝试获取存储在 list_df 中的那些日期帧,但它不起作用。 任何想法如何获取存储在向量中的那些数据帧以进行进一步计算?

list_df[1][column_name] 

list_df[1]$column_name

没用

path<-'thats my path'

list_of_files<-list.files(path) 

list_df<-c() #creating empty vector
for (i in 1:length(list_of_files)){
  assign(paste("dffile",list_of_files[i],sep=""),(read.table(paste(path,list_of_files[i],sep=""), sep=",", header=TRUE)))
  list_df[i]<-paste("dffile",list_of_files[i],sep="")
}

【问题讨论】:

  • Gawel,你正在走一些非常糟糕的(在 R 中)做法:(1)使用assign; (2) 生长对象(R Inferno 第 2 章)。这里有可能真正混淆变量和变量名称,但我不确定,因为我们不知道这些东西是什么样的。我建议你阅读 R Inferno 第 2 章,以及关于处理 lists of frames 而不是创建大量(相似)对象的 assign 方法的答案。
  • 顺便说一句:您不是在列表中存储框架,而是存储由paste 返回的字符串(或字符串向量)。如果您使用str(list_df),我怀疑您会看到"dffilesomefile.csv"(以及更多)。也许用list_df &lt;- lapply(list_of_files, read.table, sep = ",", header = TRUE)替换你所有的for循环。
  • 你是对的@r2evans。我有字符串列表。我的问题是如何转换那些包含数据框名称的字符串值。
  • 我会重申,应该不鼓励使用assignget。如果您的文件的结构都大致相同,那么将它们保存在一个列表中会有所帮助:当您对其中一个文件执行操作时,使用 lapply 您可以轻松地对所有文件执行相同的操作(没有 for 循环必需的)。同样,使用assignget 可能难以重现。但如果你仍然坚持使用assign,请查看getmget
  • 感谢 r2evans。我在 lapply 中使用了你的方法,它看起来确实更好。非常感谢。

标签: r dataframe vector read.table


【解决方案1】:

我们可以将list_df初始化为一个字符向量

list_df <- character(length(list_of_files))

现在,基于索引的分配应该可以工作了。


由于 'list_df' 包含作为字符串的对象名称,如果我们需要获取这些元素的值,请使用 get(对于单个对象)或 mget(对于列表中的所有对象)

get(list_df[1])
mget(list_df)

【讨论】:

    【解决方案2】:

    我在 lapply 上使用了你的建议,看起来确实更好:

    funct_test<-function(variable)
      {
       path<-'C:/Users/ppachlinski/Documents/lekcja1_12c/smog_krakow/'
      my_data <- list.files(path)
      list_df <- lapply(my_data, read.table, sep = ",", header = TRUE)
      ?lapply
      mylist <- lapply(sciezka, read.table, header = TRUE, sep = ',') 
    
      mean(mylist[[1]]$variable, na.rm=TRUE)
      }
    

    但我在使用此功能时遇到问题: funct_test("X169_pressure")

    我收到一个错误: 在 mean.default(mylist[[1]]$variable, na.rm = TRUE) 中: 参数不是数字或逻辑:返回 NA

    【讨论】:

    • 您不能将$ 与存储在对象中的字符串一起使用。请改用[。所以用mylist[[1]][variable]替换mylist[[1]]$variable
    • 与其尝试将path 与文件名分开处理,通常最好将文件名的完整路径包含为文件名,使用list.files(..., full.names=TRUE) 以便整个目录路径已经包括了。这通过在此函数中提供更通用的方法来帮助重现性,这样您在处理项目的较新版本时不必更改函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多