我制作了一个示例数据框,其中包含3列:颜色,值和大小。行中填充了数值,文本和空单元格。
Colour Value Size
Red 1 Big
Red nd Small
Blue nd Big
Blue NA Big
Blue 1 Medium
Yellow 1 NA
Yellow 2 Big
Green NA NA
Green nd Medium
颜色列具有重复的颜色,这些颜色在“值”列中可以具有不同的值。
如果在“值”列中找到数字值,那么我想选择该行以及具有相同颜色非数字值的行。因此,新的数据框将如下所示:
Colour Value Size
Red 1 Big
Red nd Small
Blue nd Big
Blue NA Big
Blue 1 Medium
Yellow 1 NA
Yellow 2 Big
例如,如果一行具有红色的数字值,那么我想选择红色的每一行,数字和非数字。
如果颜色完全没有数字,那么它将被完全丢弃,例如在我的示例中为绿色。
任何想法如何做到这一点?
在R base中:您可以使用grep
定位任何数字("\\d+"
),然后使用此位置获取其所属的颜色,然后使用此信息将subset
原始数据帧dat
> subset(dat, Colour %in% dat[grep("\\d+", dat$Value), "Colour"])
Colour Value Size
1 Red 1 Big
2 Red nd Small
3 Blue nd Big
4 Blue <NA> Big
5 Blue 1 Medium
6 Yellow 1 <NA>
7 Yellow 2 Big
使用dplyr
,我们可以通过filter
来group
。我们匹配包含数字的任何Value
,因为R对形式为c(1,NA,"nd")
的向量的解释默认将其转换为字符向量,因此必须使用一些正则表达式来匹配任何数字:
df %>%
group_by(Colour) %>%
filter(any(grepl("[0-9]",Value)))
# A tibble: 7 x 3
# Groups: Colour [3]
Colour Value Size
<chr> <chr> <chr>
1 Red 1 Big
2 Red nd Small
3 Blue nd Big
4 Blue NA Big
5 Blue 1 Medium
6 Yellow 1 NA
7 Yellow 2 Big
数据:
df <-structure(list(Colour = c("Red", "Red", "Blue", "Blue", "Blue",
"Yellow", "Yellow", "Green", "Green"), Value = c("1", "nd", "nd",
NA, "1", "1", "2", NA, "nd"), Size = c("Big", "Small", "Big",
"Big", "Medium", NA, "Big", NA, "Medium")), class = "data.frame", row.names = c(NA,
-9L))