读入多个csv文件并更新列

时间:2017-09-16 08:16:28

标签: r loops

我想问一下是否有效处理这些事情。

(1)有效加载数据

由于文件名与我想在环境中分配的名称不同,我做了72次。

P02 <- read.csv("P02_1.csv")
P03 <- read.csv("P03_1.csv")
P04 <- read.csv("P04_1.csv")
P06 <- read.csv("P06_1.csv")
P11 <- read.csv("P11_1.csv")
P12 <- read.csv("P12_1.csv")
P13 <- read.csv("P13_1.csv")
P14 <- read.csv("P14_1.csv")
P15 <- read.csv("P15_1.csv")

......但是认为有很多参与者......

(2)有效地改变时间格式

要更改时间格式,我尝试了类似的方法。

P02$Time <- as.POSIXct(P02$Time, format = "%Y-%m-%d %H:%M:%S")                      
P03$Time <- as.POSIXct(P03$Time, format = "%Y-%m-%d %H:%M:%S")                      
P04$Time <- as.POSIXct(P04$Time, format = "%Y-%m-%d %H:%M:%S")                      
P06$Time <- as.POSIXct(P06$Time, format = "%Y-%m-%d %H:%M:%S")                      
P11$Time <- as.POSIXct(P11$Time, format = "%Y-%m-%d %H:%M:%S")                      
P12$Time <- as.POSIXct(P12$Time, format = "%Y-%m-%d %H:%M:%S")                      
P13$Time <- as.POSIXct(P13$Time, format = "%Y-%m-%d %H:%M:%S")                      
P14$Time <- as.POSIXct(P14$Time, format = "%Y-%m-%d %H:%M:%S")                      
P15$Time <- as.POSIXct(P15$Time, format = "%Y-%m-%d %H:%M:%S")  

......再次,72次。

有没有办法有效地完成所有这些事情? 有心思使用“for loop”和“assign”功能,但不知道如何使用。

2 个答案:

答案 0 :(得分:2)

您可以使用for循环和assign函数执行此操作,但我认为更优雅的解决方案是将数据框存储在列表中。假设所有csv文件都在同一目录中,您可以遍历输入文件,读取它们,转换并将结果保存到列表中。这是一个例子:

directory <- "/path/to/your/data"
files <- list.files(directory)
data_frames <- vector("list", length(files))
for (i in seq_along(files)) {
    df <- read.csv(file.path(directory, files[i]))
    df$Time <- as.POSIXct(df$Time, format = "%Y-%m-%d %H:%M:%S")
    data_frames[[i]] <- df
}

答案 1 :(得分:2)

如果要读入工作目录中的所有csv文件,可以使用list.files获取其名称,然后一次性读取它们。这将创建一个数据框列表,这比在工作区周围有72个对象要好得多。

filenames <- list.files(pattern = "csv")
P_list <- lapply(filenames, read.csv)
names(P_list) <- sub("(^P[[:digit:]]{2}).*", "\\1", x)

现在,您可以再次使用lapply进行所需的转换。

P_list <- lapply(P_list, function(x){
        x$Time <- as.POSIXct(x$Time, format = "%Y-%m-%d %H:%M:%S")
        x
})

(未经测试,因为没有真实的数据。)