根据大型、不整洁的数据集的列中的先前条目提取特定行

Extracting specific rows based on previous entries within a column of a large, untidy dataset

提问人:Ben Smith 提问时间:2/8/2023 最后编辑:zephrylBen Smith 更新时间:2/8/2023 访问量:31

问:

我有一个相当不整洁的大型数据集,可以通过以下代码大致近似。

set.seed(1)
col_1 <- c(rep(c(1888:1891), each = 50), rep(c(1892:1895), each = 30))

a <- c('shirt', 'blue', 'red', 'green', 'pants', 'blue', 'red', 'green', 'yellow', 'sweater', 'black', 'orange', 'purple')
b <- rep(a, 30)
col_2 <- b[c(1:320)]

df <- data.frame(col_1, col_2)

其中,每种颜色是指最后提到的服装的颜色。

我想问你的问题是,我将如何每年提取毛衣的不同颜色?

但是,与实际数据存在一些差异:

  • 真正的数据集是每月一次的,但我只对每种颜色是否每年出现感兴趣
  • 真正的数据集的重复性要低得多,每个月都会随机进入颜色
  • 真实的数据集每月包含大约十几种不同的“服装”。

我曾想过尝试一些粗略的方法,例如简单地提取每个“毛衣”出现后的下一个 ~50 个数据点,但我什至不确定如何做到这一点,并希望得到更干净的东西,因为这仍然需要大量的整理,因为“毛衣”每年至少会出现 12 次。

r 操作 数据 清洗

评论

0赞 John Polo 2/8/2023
这个样本真的是你的数据集吗?第一列应该是什么意思?为什么颜色和服装类型在同一列中?这个样本应该代表一年、一个月还是一周?请观看:根据以下指南 stackoverflow.com/tour 并编辑您的问题:stackoverflow.com/questions/5963269/...
0赞 Edward 2/8/2023
我建议你提供真实数据的样本。你的粗略近似要么太粗糙,要么太不整洁而无法整理。

答:

0赞 zephryl 2/8/2023 #1

首先将所有衣服拉到自己的列中:

library(dplyr)

garments <- c("shirt", "pants", "sweater")

df2 <- df %>%
  group_by(garment = cumsum(col_2 %in% garments)) %>%
  mutate(garment = first(col_2)) %>%
  ungroup() %>%
  filter(!(col_2 %in% garment))
  
df2
# A tibble: 246 × 3
   col_1 col_2  garment
   <int> <chr>  <chr>  
 1  1888 blue   shirt  
 2  1888 red    shirt  
 3  1888 green  shirt  
 4  1888 blue   pants  
 5  1888 red    pants  
 6  1888 green  pants  
 7  1888 yellow pants  
 8  1888 black  sweater
 9  1888 orange sweater
10  1888 purple sweater
# … with 236 more rows

然后,您可以筛选到特定服装(如毛衣)每年的不同值:


df2 %>%
  filter(garment == "sweater") %>%
  distinct(col_1, col_2)
# A tibble: 24 × 2
   col_1 col_2 
   <int> <chr> 
 1  1888 black 
 2  1888 orange
 3  1888 purple
 4  1889 orange
 5  1889 purple
 6  1889 black 
 7  1890 black 
 8  1890 orange
 9  1890 purple
10  1891 black 
# … with 14 more rows