R 根据多列的值提取行
我有一个大数据框,下面对其进行了简化。给定以下数据帧结构,我需要折叠以返回两个不同的行,其中col3具有不同的值,但col1和col2具有唯一的值R 根据多列的值提取行,r,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
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
然而,如果col3只是z,我将不返回任何行。我可以通过table函数获得这些数据的计数,但我需要查看实际的行。
有什么想法吗
谢谢非常简单
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
尝试以下方法:
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>
请注意,我在过滤器中使用的是
length(unique())
,而不是n_distinct
,因为有一个dplyr
错误,使得分组数据帧的过滤器中的n_distinct
运行速度非常慢。好吧,我成功地获得了所需的输出,但我想知道它是否适用于您的真实数据。我使用as.data.frame(apply(dat,2,unique))
获得它。让我知道这是否适用于您。在示例数据中,我在哪里看到col1=col2?你是说每一个col1,col2值的唯一组合吗?@Gopala,是的,这就是我的意思。我为措词不当而道歉。我已经进行了更新,以使其更有意义。当col3值在整个过程中都很常见时,这将无法产生“无行”输出,正如海报所建议的那样。
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>
# A tibble: 2 x 3
# Groups: col1, col2 [1]
col1 col2 col3
<dbl> <chr> <chr>
1 1 A Z
2 1 A Y