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