【问题标题】:extracting rows depending on the value of multiple columns根据多列的值提取行
【发布时间】:2018-11-14 23:29:58
【问题描述】:

我有一个大型数据框,在下面进行了简化。鉴于以下数据框结构,我需要折叠以返回两个不同的行,其中 col3 具有不同的值,但 col1 和 col2 具有唯一值。

dat <- data.frame("col1" = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), 
       "col2" = c( "A","A", "A", "A", "A", "A", "A", "A", "A", "A"," A", "A", "A", "A", "A"),
       "col3" = c( "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Y", "Y", "Y", "Y", "Y", "Y"))

   col1 col2 col3
1     1    A    Z
2     1    A    Z
3     1    A    Z
4     1    A    Z
5     1    A    Z
6     1    A    Z
7     1    A    Z
8     1    A    Z
9     1    A    Z
10    1    A    Y
11    1    A    Y
12    1    A    Y
13    1    A    Y
14    1    A    Y
15    1    A    Y

所以在这种情况下,我只需要返回以下内容:

   col1 col2 col3
      1    A    Z
      1    A    Y

但是,如果 col3 只是 z,我将不返回任何行。我可以使用 table 函数获取这些数据的计数,但我需要查看实际的行。 有什么想法吗?

谢谢

【问题讨论】:

  • 好吧,我设法获得了所需的输出,但我想知道它是否适用于您的真实数据。我通过使用as.data.frame(apply(dat, 2, unique)) 得到它。让我知道这是否适合您。
  • 在示例数据中哪里可以看到 col1 = col2?您是指 col1、col2 值的每个唯一组合吗?
  • @Gopala,是的,我就是这个意思。我为糟糕的措辞道歉。我已经更新以更有意义。

标签: r


【解决方案1】:

试试这个:

library(dplyr)
dat %>%
  group_by(col1, col2) %>%
  filter(length(unique(col3)) > 1) %>%
  distinct()

如果dat如下:

dat <- structure(list(col1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1), col2 = c("A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A"), col3 = c("Z", "Z", "Z", "Z", "Z", 
"Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z")), class = "data.frame", row.names = c(NA, 
-15L))

你没有得到如下行:

# A tibble: 0 x 3
# Groups:   col1, col2 [0]
# ... with 3 variables: col1 <dbl>, col2 <chr>, col3 <chr>

如果dat 与您在原始帖子中提供的一样,您将获得所需的输出:

# A tibble: 2 x 3
# Groups:   col1, col2 [1]
   col1 col2  col3 
  <dbl> <chr> <chr>
1     1 A     Z    
2     1 A     Y    

请注意,我在过滤器中使用了length(unique()) 而不是n_distinct,因为有一个dplyr 错误使n_distinct 在分组数据框的过滤器中运行非常缓慢。

【讨论】:

    【解决方案2】:

    好简单的dplyr 解决方案:

    dat <- structure(list(col1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1), col2 = c("A", "A", "A", "A", "A", "A", "A", "A", "A", 
    "A", "A", "A", "A", "A", "A"), col3 = c("Z", "Z", "Z", "Z", "Z", 
    "Z", "Z", "Z", "Z", "Y", "Y", "Y", "Y", "Y", "Y")), class = "data.frame", row.names = c(NA, 
    -15L))
    
    library(dplyr)
    
    dat %>% group_by(col1,col2) %>% distinct()
    
    # A tibble: 2 x 3
    # Groups:   col1, col2 [1]
       col1 col2  col3 
      <dbl> <chr> <chr>
    1     1 A     Z    
    2     1 A     Y
    

    在您的dat 版本中,您的col2 值中有一个空格,如果这不是拼写错误,您需要先修复它,以便distinct() 正确聚合:

    dat %>% mutate(col2 = trimws(col2)) %>% group_by(col1,col2) %>% distinct()
    

    【讨论】:

    • 当 col3 值在整个过程中很常见时,这将无法产生“无行”输出 - 正如海报所暗示的那样输出应该是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多