过滤零值之间的行并保存为新的数据框或数据表

问题描述 投票:0回答:1

我有一个大型 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   
r dataframe filter group-by
1个回答
0
投票

这是一种使用基本算术对行进行分组的方法。 我使用指示变量的累积和(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
将数据保存到磁盘。

© www.soinside.com 2019 - 2024. All rights reserved.