提问人:Ben Smith 提问时间:2/8/2023 最后编辑:zephrylBen Smith 更新时间:2/8/2023 访问量:31
根据大型、不整洁的数据集的列中的先前条目提取特定行
Extracting specific rows based on previous entries within a column of a large, untidy dataset
问:
我有一个相当不整洁的大型数据集,可以通过以下代码大致近似。
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 次。
答:
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
上一个:如何根据列替换两行之间的整行
评论