循环(或 lapply)数据文件的切片函数,并在 R 中将每个新部分另存为不同的 csv

Loop (or lapply) a slice function for a datafile and saving each new part as different csvs in R

提问人:Nacho 提问时间:11/9/2022 更新时间:11/9/2022 访问量:40

问:

我有一个csv。它包括每天每半小时的记录值。 我想用半小时的时间块(用“系统睡眠”文本分隔),并将每个分隔的块保存为一个独立的.csv文件,以便进一步分析。 我当前的代码;slice

df <- read.csv("datafile",h=T,sep=",")

M <- which(startsWith(df$ID, "system sleep."))

M2 <- M[1]

df2 <- slice(df,c(1:M2-1))

write.csv(write_csv(df2, file = paste0("test", df2$Time[1], "-", ".csv")))

我这样做是为了我可以瞄准第一个系统睡眠。我试过改用,但到目前为止还没有用。我可以切片并保存第一部分,但我想循环它,以便它继续执行其余部分。也许我可以有不同的方法,但这是我迄今为止发现的最好的方法。M2 <- M[1]M2 <- M[i]

有关文件外观的修改和简化示例如下:

编号 时间 娱乐 价值
答1 2018/1/30 00:00 1 251
答1 2018/1/30 00:01 2 368
答1 2018/1/30 00:02 3 430
系统休眠。
答1 2018/1/30 00:30 1 195
答1 2018/1/30 00:31 2 876
答1 2018/1/30 00:32 3 864
系统休眠。
答1 2018/1/30 01:00 1 872
答1 2018/1/30 01:01 2 120
答1 2018/1/30 01:02 3 208
系统休眠。
(...) (...) (...) (...) (...)
答1 2018/1/30 23:39 10 002

谢谢

R 循环切 导出到 CSV lapply

评论

0赞 D.J 11/9/2022
请将简化数据作为 -sample 上传,以便将其复制到 R 会话中dput()

答:

0赞 stefan 11/9/2022 #1

您可以向数据集添加块标识符列,而不是切片。之后,您可以将数据拆分为多个块并使用例如 要将数据导出到单独的 CSV 中,请执行以下操作:lapply

注意:不确定是否要保留“系统睡眠”行。在下面的代码中,我决定放弃它。

# Add block identifier
dat$block <- cumsum(grepl("^sys", dat$ID))
# Get rid of "sys sleep"
dat <- dat[!grepl("^sys", dat$ID),]
# Split into blocks
dat_split <- split(dat, dat$block)
# Export
path <- tempdir()

foo <- lapply(dat_split, function(x) write.csv(x, file = file.path(path, paste0("test", x$Time[[1]], "-", ".csv")), row.names = FALSE))

# Check
fns <- list.files(path = path, pattern = "\\.csv", full.names = TRUE)
lapply(fns, read.csv)
#> [[1]]
#>   ID       Day  Time Rec value block
#> 1 A1 2018/1/30 00:00   1   251     0
#> 2 A1 2018/1/30 00:01   2   368     0
#> 3 A1 2018/1/30 00:02   3   430     0
#> 
#> [[2]]
#>   ID       Day  Time Rec value block
#> 1 A1 2018/1/30 00:30   1   195     1
#> 2 A1 2018/1/30 00:31   2   876     1
#> 3 A1 2018/1/30 00:32   3   864     1
#> 
#> [[3]]
#>   ID       Day  Time Rec value block
#> 1 A1 2018/1/30 01:00   1   872     2
#> 2 A1 2018/1/30 01:01   2   120     2
#> 3 A1 2018/1/30 01:02   3   208     2
#> 
#> [[4]]
#>   ID       Day  Time Rec value block
#> 1 A1 2018/1/30 23:39  10     2     3

数据

dat <- data.frame(
  ID = c(
    "A1", "A1", "A1",
    "system sleep.", "A1", "A1", "A1",
    "system sleep.", "A1", "A1", "A1", "system sleep.",
    "A1"
  ),
  Day = c(
    "2018/1/30",
    "2018/1/30", "2018/1/30", NA, "2018/1/30", "2018/1/30",
    "2018/1/30", NA, "2018/1/30", "2018/1/30",
    "2018/1/30", NA, "2018/1/30"
  ),
  Time = c(
    "00:00", "00:01",
    "00:02", NA, "00:30", "00:31", "00:32", NA,
    "01:00", "01:01", "01:02", NA, "23:39"
  ),
  Rec = c(
    "1", "2", "3", NA,
    "1", "2", "3", NA, "1", "2", "3", NA,
    "10"
  ),
  value = c(
    "251", "368",
    "430", NA, "195", "876", "864", NA, "872", "120",
    "208", NA, "002"
  )
)