【问题标题】:How to import multiple files into a list while keeping their names?如何在保留名称的同时将多个文件导入列表?
【发布时间】:2020-09-14 03:37:33
【问题描述】:

我正在从服务器读取几个 SAS 文件并将它们全部加载到 R 中的列表中。我删除了其中一个数据集,因为我在最终分析中不需要它(日期集 #31)

mylist<-list.files("path" ,  pattern = ".sas7bdat")
mylist <- mylist[- 31]

然后我用 lapply 同时读取了列表(mylist)中的所有数据集

read.all <- lapply(mylist, read_sas)

代码运行良好。但是,当我运行 view(read.all) 查看数据集时,我只能看到一个数字(例如 1、2 等)而不是初始数据集的名称。 有谁知道我如何将数据集的名称保留在最终列表中? 另外,谁能告诉我如何在 R 中使用这个列表? 它是一个对象吗?我可以阅读列表的日期集之一吗?或者如何加入列表中的一些数据集?

【问题讨论】:

  • 您好,使用不可复制的代码非常困难。您能否提供一个可复制的示例和所需输出的示例?仅基于当前的问题,也许this solution 可以帮助您。列表是对象的容器。您可以使用常用符号([][[]]、对象名称、相对位置等)访问列表中的对象。你会在互联网上找到很多教程(如thisthis 关于列表
  • 你想要names(read.all) &lt;- mylist 吗?
  • sapply(newfi, read_sas, simplify=FALSE) 的作用与lapply 相同,但保留名称。
  • @RonakShah,对不起,我已经更正了代码。因此,我正在从服务器读取各种数据集并将它们放入列表(mylist)中。然后我使用 lapply(mylist, read_sas) 阅读它们 - 当我查看作为列表的最终产品 (read.all) 时,它只显示数字而不是导入数据集的名称。
  • @r2evans 感谢它正在工作,但它显示了数据集的整个路径,而不仅仅是日期集的名称。这是我在列表中导入的数据集之一看到的://xxxxxxxxxxxxxxxxxxxxxxxxxxxx/all_lift_batch.sas7bdat - 但我只需要查看数据集的名称,在这方面它是 all_lift_batch,没有路径地址,也没有 .sas7bdat跨度>

标签: r database list import lapply


【解决方案1】:

使用basenametools::file_path_sans_ext

filenames <- head(list.files("~/StackOverflow", pattern = "^[^#].*\\.R", recursive = TRUE, full.names = TRUE))
filenames
# [1] "C:\\Users\\r2/StackOverflow/1000343/61469332.R"  "C:\\Users\\r2/StackOverflow/10087004/61857346.R"
# [3] "C:\\Users\\r2/StackOverflow/10097832/60589834.R" "C:\\Users\\r2/StackOverflow/10214507/60837843.R"
# [5] "C:\\Users\\r2/StackOverflow/10215127/61720149.R" "C:\\Users\\r2/StackOverflow/10226369/60778116.R"
basename(filenames)
# [1] "61469332.R" "61857346.R" "60589834.R" "60837843.R" "61720149.R" "60778116.R"
tools::file_path_sans_ext(basename(filenames))
# [1] "61469332" "61857346" "60589834" "60837843" "61720149" "60778116"

somedat <- setNames(lapply(filenames, readLines, n=2), 
                    tools::file_path_sans_ext(basename(filenames)))
names(somedat)
# [1] "61469332" "61857346" "60589834" "60837843" "61720149" "60778116"

str(somedat)
# List of 6
#  $ 61469332: chr [1:2] "# https://stackoverflow.com/questions/61469332/determine-function-name-within-that-function/61469380" ""
#  $ 61857346: chr [1:2] "# https://stackoverflow.com/questions/61857346/how-to-use-apply-family-instead-of-nested-for-loop-for-my-problem?noredirect=1" ""
#  $ 60589834: chr [1:2] "# https://stackoverflow.com/questions/60589834/add-columns-to-data-frame-based-on-function-argument" ""
#  $ 60837843: chr [1:2] "# https://stackoverflow.com/questions/60837843/how-to-remove-all-parentheses-from-a-vector-of-string-except-whe"| __truncated__ ""
#  $ 61720149: chr [1:2] "# https://stackoverflow.com/questions/61720149/extracting-the-original-data-based-on-filtering-criteria" ""
#  $ 60778116: chr [1:2] "# https://stackoverflow.com/questions/60778116/how-to-shift-data-by-a-factor-of-two-months-in-r" ""

每个“名称”都是(在这种情况下)stackoverflow 问题编号的字符表示,删除了".R"。 (而且由于我通常将普通 URL 作为第一行,然后在我用来测试/播放和回答 SO 问题的文件中包含一个空行,所有这些文件在前两行看起来都相似。)

【讨论】:

  • 谢谢!我写了 somedat
  • 您是否碰巧有一个文档/教程可以使用 R 中的数据集列表来推荐?干杯
  • 在 SO,stackoverflow.com/a/24376207/3358272 是一个很好的参考。那里有几个不同的答案,请阅读。通常,当您倾向于在每个框架上执行相同(或相似)的步骤并希望有效地执行时,框架列表是一种很好的方法;为此,请熟悉lapplysapply(或他们的任何表亲);对于高级工作,可以随时考虑Map。这些都是好的开始。 (如果此答案解决了您的问题,请accept it。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多