根据多列的值提取行

时间:2018-11-14 23:29:58

标签: r

我有一个大型数据框,下面对此进行了简化。给定以下数据帧结构,我需要折叠以返回两个不同的行,其中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,我将不返回任何行。我可以使用表函数获得这些数据的计数,但是我需要查看实际的行。 有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分: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运行得非常厉害慢慢地。

答案 1 :(得分:0)

很好的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()