R 在顺序标记的数据帧上重复函数

R 在顺序标记的数据帧上重复函数,r,R,对于R专家来说,这无疑是一个容易解决的问题 我需要在顺序标记的数据帧上重复一些函数(在将它们合并到一起之前)。例如,我可能需要执行以下操作: # READ IN DATAFILES & LABEL DF'S df1 <- read.csv(file="file_A.csv",head=TRUE) df2 <- read.csv(file="file_B.csv",head=TRUE) df3 <- read.csv(file="file_C.csv",head=T

对于R专家来说,这无疑是一个容易解决的问题

我需要在顺序标记的数据帧上重复一些函数(在将它们合并到一起之前)。例如,我可能需要执行以下操作:

# READ IN DATAFILES & LABEL DF'S 
df1 <- read.csv(file="file_A.csv",head=TRUE) 
df2 <- read.csv(file="file_B.csv",head=TRUE) 
df3 <- read.csv(file="file_C.csv",head=TRUE)

# TURN DF'S INTO DATA TABLES
df1<-data.table(df1)
df2<-data.table(df2)
df3<-data.table(df3)

# CHANGE VARIABLE TO POSIX
df1$date <-as.POSIXct(df1$date, format = "%Y-%m-%d %H:%M:%S")
df2$date <-as.POSIXct(df2$date, format = "%Y-%m-%d %H:%M:%S")
df3$date <-as.POSIXct(df3$date, format = "%Y-%m-%d %H:%M:%S")

# FILTER BY DATE RANGE
date_filter<-as.POSIXct("2012-01-01 01:01:01")
df1<-subset(df1, df1$date>date_filter)
df2<-subset(df2, df2$date>date_filter)
df3<-subset(df3, df3$date>date_filter)

# AGGREGATE OVER A UNIQUE ID 
df1<-df1[,(sum(var)), by=list(id)] 
df2<-df2[,(sum(var)), by=list(id)] 
df2<-df2[,(sum(var)), by=list(id)] 

# FINALLY, MERGE TOGETHER
df <-merge(df1,df2, by="id",all=TRUE)

如何访问这些
数据.tables
以查看是否一切正常?

您可以使用
列表.files
从目录中获取所有CSV文件,并使用
lappy
以这种方式递归:

# Thanks Matthew for correcting the pattern string
files <- list.files("path_to_files", full.names = TRUE, pattern="\\.csv$") 
out <- lapply(1:length(files), function(idx) {
    df <- as.data.table(read.csv(files[idx], header = TRUE))
    df$date <- as.POSIXct(df$date, format = "%Y-%m-%d %H:%M:%S")
    date_filter <- as.POSIXct("2012-01-01 01:01:01")
    df <- subset(df, df$date > date_filter)
    df <-df[, (sum(var)), by = list(id)]
})

你好,非常感谢。我可能错了,但我不认为我可以使用
rbind
,因为我需要进行外部联接,这样我就可以为每个唯一的ID(即使该唯一ID不在每个data.frame中)设置一行。thinks?@Arun,+1,但您需要
模式='\\\.csv$'
。您现在拥有的将与包含“csv”的任意数量的名称匹配。另外,请记住R正则表达式中的“*”是“前一个字符的0或更多”,而不是通配符。@roody请查看包整形(非整形2)中的
merge\u recurse
。如果你仔细研究一下,可能还有一个巧妙的data.table解决方案。@Arun-我收到一条错误消息,上面说
“不知道如何将'df$date'转换为类”POSIXct“
。我已经仔细检查了一下,确保当我按顺序运行每个df的命令时,该命令能正常工作,并且它能……你认为呢?是的,我也不能。我从为每个数据表顺序运行的行中复制了该代码,它可以正常工作。我不知道发生了什么…解决了!人为错误是罪魁祸首——一个额外的CSV文件潜入我的文件夹,它没有变量“date”,这会把一切都搞砸。我应该通过打印“文件”来再次检查。非常感谢您的帮助,如果这浪费了您的时间,我也很抱歉!最后一个问题!如果我没有时间担心“reduce”命令,我如何手动访问创建的data.tables以便合并它们???@Arun-我是否将函数嵌入reduce命令中?抱歉迟钝:(Hi@Arun-请查看更新。合并不起作用,因为R似乎对唯一标识符感到困惑,该标识符始终是数字的(但似乎是作为一个因素读入的)。将其更改为
data.table
使命令起作用,但现在似乎有
数据。tables
嵌套在
out
中。在上面再次更新。
> head(out)
            out
1: <data.table>
2: <data.table>
3: <data.table>
4: <data.table>
5: <data.table>
6: <data.table>
# Thanks Matthew for correcting the pattern string
files <- list.files("path_to_files", full.names = TRUE, pattern="\\.csv$") 
out <- lapply(1:length(files), function(idx) {
    df <- as.data.table(read.csv(files[idx], header = TRUE))
    df$date <- as.POSIXct(df$date, format = "%Y-%m-%d %H:%M:%S")
    date_filter <- as.POSIXct("2012-01-01 01:01:01")
    df <- subset(df, df$date > date_filter)
    df <-df[, (sum(var)), by = list(id)]
})
out.merge <- Reduce(function(...) merge(..., by="id", all=T), out)