提问人:Nacho 提问时间:11/9/2022 更新时间:11/9/2022 访问量:40
循环(或 lapply)数据文件的切片函数,并在 R 中将每个新部分另存为不同的 csv
Loop (or lapply) a slice function for a datafile and saving each new part as different csvs in R
问:
我有一个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 |
谢谢
答:
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"
)
)
评论
dput()