R:根据条件选择数据帧的重复行

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

我制作了一个示例数据框,其中包含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 duplicates
3个回答
1
投票

在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

0
投票

使用dplyr,我们可以通过filtergroup。我们匹配包含数字的任何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))
© www.soinside.com 2019 - 2024. All rights reserved.