楼主: aagain
3459 14

[问答] 批量导入名字有规律的CSV文件数据的问题? [推广有奖]

  • 0关注
  • 0粉丝

高中生

55%

还不是VIP/贵宾

-

威望
0
论坛币
9 个
通用积分
25.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
801 点
帖子
21
精华
0
在线时间
34 小时
注册时间
2010-4-22
最后登录
2023-4-6

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在我的工作目录里面有若干个csv文件:001.csv,002.csv,...,332.csv。
我需要写个代码:把输入的相应的文件序号的文件读入一个数据框文件。
下面是我的代码:

read.data <- function(x) {
  ## Define a function name read.data() to input all data.
  i.x <- 1:length(x)
       ## Use vector x 's index as loop number.

  for(i in i.x) {
    m.i <- formatC(x, flag = 0, width = 3)
          ## Change the i to a charactor with 3 digitals width,
          ## for example: 1 to "001"."
    d.m.i <- paste(m.i, "csv", sep = ".")
          ## Change the m.i to file name,
          ## for example:002 to 002.csv.
    pl.d.i <- read.table(d.m.i, header = TRUE, sep = ",")
    pl.data <<- rbind(pl.data, pl.d.i)
  }
}


这段代码定义了一个叫read.data的函数,当我运行这个函数的时候,比如read.data(1:3), 它应该把文件“001.csv","002.csv"和"003.csv"这几个文件中的数据依次合并到pl.data这个数据框中。
但是现在它最终只能把最后一个文件“在这个例子中是003.csv这个文件”读入到pl.data中。

哪位高手帮我看看到底出了什么问题?
非常谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:工作目录 READ Data EAD 数据框

沙发
aagain 发表于 2017-9-17 20:35:43 |只看作者 |坛友微信交流群
受到这个帖子的启发,https://bbs.pinggu.org/thread-2799231-1-1.html。我把代码改成如下:

read.data <- function(x) {
    ## Define a function name read.data() to read all data.
    m.x <- formatC(x, flag = 0, width = 3)
      ## Change the i to a charactor with 3 digitals width,
      ## for example: 1 to "001"."
    d.m.x <- paste(m.x, "csv", sep = ".")
      ## Change the m.i to file name,
      ## for example:002 to 002.csv.
    dat1 <<- do.call(rbind,lapply(d.m.x,read.csv))
}  

完美解决我的问题,虽然其实还不知道最后一句的具体语法和意思,但是管用:)

使用道具

藤椅
aagain 发表于 2017-9-17 20:43:59 |只看作者 |坛友微信交流群
如果哪位高手能够告诉我:如何利用循环语句,批量导入有规律名字的csv文件数据,将非常感激。
因为我现在还是不明白1楼的代码问题出在哪里,很苦恼。

使用道具

板凳
aagain 发表于 2017-9-19 10:12:19 |只看作者 |坛友微信交流群
我终于找到了1楼中我代码的问题所在(红色字体部分是和一楼不同的地方),这就是新人的苦恼啊,基本概念不熟悉,更改代码如下就能成功实现: 输入任何1到999之间的数字向量,就能读取读取工作目录下相应文件(001.csv,002.csv,...,999.csv.)中的数据为数据框,并且最终合并成一个数据框文件:

read.data <- function(x) {
  ## Define a function name read.data() to read all data.
  i.x <- 1:length(x)   ## Use vector x's index as loop number.
pl.data <- data.frame()
    ## 定义一个空数据框,因为后面
    ## for循环中要用到这个变量
  for(i in i.x) {
    m.i <- formatC(x, flag = 0, width = 3)
        ## Change the i to a charactor with 3 digitals width,
        ## for example: 1 to "001"."
    d.m.i <- paste(m.i, "csv", sep = ".")
        ## Change the m.i to file name,
        ## for example:002 to 002.csv.
    pl.d.i <- read.table(d.m.i, header = TRUE, sep = ",",
                         stringsAsFactors = FALSE)
    pl.data <- rbind(pl.data, pl.d.i)
    ## 1楼代码主要出在这一句,用的是超级赋值<<-,这样pl.data就不存在for函数内,而存在于全球环境中了。
  }
  return(pl.data) ## 关键是这一句,不能在for函数内
}

使用道具

报纸
屋檐滴语 发表于 2017-9-19 10:35:30 |只看作者 |坛友微信交流群
  1. library(plyr)
  2. paths <‐ dir("data", pattern = "\\.csv$", full.names = TRUE)
  3. names(paths) <‐ basename(paths)
  4. ldply(paths, read.csv, stringsAsFactors = FALSE)
复制代码

使用道具

地板
csh329 发表于 2017-9-19 20:07:26 |只看作者 |坛友微信交流群
  1. library(dplyr)
  2. lt <- lapply(filenames, read.csv) %>%
  3.   bind_rows()
复制代码

使用道具

7
屋檐滴语 发表于 2017-9-19 23:37:15 |只看作者 |坛友微信交流群
csh329 发表于 2017-9-19 20:07
good staff&#128077;

使用道具

8
屋檐滴语 发表于 2017-9-19 23:37:26 |只看作者 |坛友微信交流群
csh329 发表于 2017-9-19 20:07
good staff&#128077;

使用道具

9
屋檐滴语 发表于 2017-9-19 23:37:34 |只看作者 |坛友微信交流群
csh329 发表于 2017-9-19 20:07
good staff&#128077;

使用道具

10
屋檐滴语 发表于 2017-9-19 23:37:35 |只看作者 |坛友微信交流群
csh329 发表于 2017-9-19 20:07
good staff&#128077;

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 17:35