【问题标题】:R: Select duplicate rows of dataframe based on conditionR:根据条件选择重复的数据框行
【发布时间】:2019-11-05 15:11:31
【问题描述】:

我制作了一个包含 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

颜色列具有重复的颜色,这些颜色在值列中可以具有不同的值。

如果在 Value 列中找到数值,那么我想选择该行以及具有相同颜色的非数值的行。所以新的数据框看起来像这样:

Colour  Value   Size
Red     1       Big
Red     nd      Small
Blue    nd      Big
Blue    NA      Big
Blue    1       Medium
Yellow  1       NA
Yellow  2       Big

因此,例如,如果 1 行具有红色的数值,那么我想为红色、数字和非数字选择每一行。

如果一种颜色根本没有数值,那么它将被完全丢弃,例如我的示例中的绿色。

有什么想法可以做到这一点吗?

【问题讨论】:

  • 您的数据(值列)实际上是数字而不是字符吗?我不确定层次结构,但考虑到 nd 的存在,这不会是字符而不是数字吗?如果是字符,我猜你可能会使用 RegEx 来匹配数字。
  • 我的小错误,此实例中的数值尚未设置为数字

标签: r duplicates


【解决方案1】:

使用dplyr,我们可以通过groupfilter。我们匹配任何包含数字的 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))

【讨论】:

  • filter(sum(!is.na(as.numeric(Value))) &gt; 0)
  • 非常感谢!
【解决方案2】:

在R base中:你可以用grep定位任意一个数字("\\d+"),然后用这个位置来获取它们属于什么颜色,然后用这个信息到subset原始数据框@987654324 @

> 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2018-03-02
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多