我有一个大型 csv 数据集,包含超过 45k 行和 19 个不同的变量。我想通过特定变量(V4)对其进行过滤,以便每个过滤组都以 0 开头,然后下一个 0 将标记新组/数据帧/数据表的开始,同时将所有其他变量保留在这个新表中出色地。我需要这些单独的组来进一步分析每个数据案例。 我试过:
filtered_data <- my_data %>%
group_by("V4") %>%
filter("V4" == 0 & "V4" !=0)
View(filtered_data)
第一个“V4”== 0似乎有效,但我正在努力如何定义每个过滤数据帧的结尾,例如如何从 0 到 3 过滤,然后从 0 到 5 等等过滤。 如何确定每个案例的长度?是否有一个逻辑运算符可以在 V4 再次变为 0 之前保存每个组?或者创建一个循环会更好吗?
my_data 示例:
V1 V2 V3 V4 . . . V19
1 0
2 1
3 2
4 ` 3
5 0
6 1
7 2
8 3
9 4
10 5
11 0
...
45k
这是一种使用基本算术对行进行分组的方法。 我使用指示变量的累积和(V4 是否为 0)创建组,并使用
group_split
将 data.frame 拆分为单个数据帧。
# example data 12000 rows in total, 4000 groups of 3 rows
df <- data.frame(V1 = 1:12000,
V2 = sample(LETTERS, 12000, replace = T),
V4 = rep(0:2, 4000))
df <- df %>%
mutate(Groups = ifelse(V4 == 0, 1, 0),
Groups = cumsum(Groups)) %>%
group_split(Groups)
所以第一个组/数据框是
> df[[1]]
# A tibble: 3 x 4
V1 V2 V4 Groups
<int> <chr> <int> <dbl>
1 1 L 0 1
2 2 L 1 1
3 3 Y 2 1
第二个
> df[[2]]
# A tibble: 3 x 4
V1 V2 V4 Groups
<int> <chr> <int> <dbl>
1 4 Z 0 2
2 5 N 1 2
3 6 Y 2 2
等等。
如果你想单独保存每个data.frame,你可以使用这样的东西:
# new environment that holds all data.frames
dfEnv <- new.env()
df %>%
mutate(Groups = ifelse(V4 == 0, 1, 0),
Groups = cumsum(Groups)) %>%
group_by(Groups) %>%
do({
# save every group inside the new environment as a single data.frame
dfEnv[[paste0("Group_", unique(.$Groups))]] <- .
})
现在你有
dfEnv$Group_1
,dfEnv$Group_2
,......等等。
在 do()
中,您还可以使用 saveRDS
或 write.csv
将数据保存到磁盘。