在顺序标记的数据帧上重复功能

标签 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=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)

你明白了——我只需要对 25 个数据帧执行此操作,而不是 3 个。我怀疑我可以通过创建一个向量(df_nums<-c(1:25)))然后使用一个函数来循环所有的 R 重复函数我的数据框,但我不知道该怎么做。

请帮忙!谢谢!

编辑:感谢 Arun,我的实际代码可以做到这一点:
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-11-13 01:01:01")
  df <- subset(df, df$date > date_filter)
  df <- df[, .N, by = list(id)] 
})
out<-data.table(out)
out.merge <- Reduce(function(...) merge(..., by="id", all=T), out)

编辑 2:运行以下语法后,我似乎有 data.tables嵌套在 out.例如,
> head(out)
            out
1: <data.table>
2: <data.table>
3: <data.table>
4: <data.table>
5: <data.table>
6: <data.table>

我如何访问这些 data.tables看看一切是否正常?

最佳答案

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

# 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)]
})

您可以使用 do.call(rbind, out)do.call(cbind, out)按行或列绑定(bind)所有结果。

编辑:在@roody 关于外部连接的问题之后。像这样的东西?
out.merge <- Reduce(function(...) merge(..., by="id", all=T), out)

关于在顺序标记的数据帧上重复功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14442173/

相关文章:

根据区域数量 reshape 我的数据

r - 按组清除 R 数据框中的行

r - 为什么调用 `detach` 会导致 R 调用 "forget"函数?

r - 如何将带有换行符的数据从文本文件导入到 R 中?

r - 使用 grepl 匹配具有一个特定数字的名称

python - R-Python : Getting Monthly, 每周索引点

R 使用 dcast、melt 和 concatenation reshape 数据框

R - 计算 Shiny 下载按钮的点击次数

r - 从数据框中手动创建 ROC 曲线

r - 获取每行最大值的列名