我有一个数据帧data

vp | v1 | v2 | v3 | v4
 0 |  a |  b |  c | ...
 0 |  d |  e |  f | ...
 0 |  g |  h |  i | ...
 1 |  a |  b |  c | ...
 1 |  d |  e |  f | ...
 1 |  g |  h |  i | ...
 ...

我想验证一下,对于每个vp,我都有var1、var2和var3的必要组合.

为此,我创建了一个数据帧prototype,其中包含必要的组合

 var1 | var2 | var3 
  a   |  b   |  c   
  d   |  e   |  f   
  g   |  h   |  i   

并try 判断它是否与每个VP组的相应部分相同

data %>% group_by(vp) %>% summarise(identical = identical(. %>% 
                                                            # as.data.frame() %>%
                                                            select(var1, var2, var3) %>%
                                                            arrange(var1, var2, var3),
                                                          prototype %>% arrange(var1, var2, var3))

So I expected, that I could select the area of the data.frame per group (maybe transform it into a new data.frame, if the data format would be relevant) and than check, that it is identical.
However the result is always FALSE

如果我不使用group_bysummarise,而是使用筛选器(VP==...)并按组手动执行,它将按预期工作.

为什么我说错了?如何实现我的try (最好是dplyr/tidyr风格)?

MVC:

library(dplyr)

data <- data.frame(vp = c(rep(0,3), rep(1,3), rep(2,3)),
                   v1 = rep(c("a", "d", "g"), 3),
                   v2 = rep(c("b", "e", "h"), 3),
                   v3 = c(rep(c("c", "f", "i"), 2), c("c", "f", "x")))

prototype <- data.frame(v1 = c("a", "d", "g"),
                        v2 = c("b", "e", "h"),
                        v3 = c("c", "f", "i"))

expected_result <- data.frame(vp=c(1,2,3), identical=c(TRUE, TRUE, FALSE))

data %>% group_by(vp) %>% summarise(identical = identical(. %>%
                                                            select(v1, v2, v3) %>%
                                                            arrange(v1, v2, v3),
                                                          prototype %>%
                                                            arrange(v1, v2, v3)))

推荐答案

我会做一个 map 方法,首先将数据分成组,然后他们将其与您的原型进行比较:

library(tidyverse)
data %>%
  group_split(vp) %>%
  map(.x = .,
      .f = ~.x %>%
        select(v1:v3) %>%
        as.data.frame() %>%
        identical(., prototype))

结果是一个带有True/False的列表.但如果需要,当然可以很容易地将其转换为另一种数据 struct .

[[1]]
[1] TRUE

[[2]]
[1] TRUE

[[3]]
[1] FALSE

根据艾伦·卡梅伦的建议更新:

data %>%
  nest(-vp) %>%
  mutate(identical = map(.x = data,
                         .f = ~.x %>%
                           select(v1:v3) %>%
                           as.data.frame() %>%
                           identical(., prototype)) %>%
                       unlist())

这提供了:

# A tibble: 3 x 3
     vp data             identical
  <dbl> <list>           <lgl>    
1     0 <tibble [3 x 4]> TRUE     
2     1 <tibble [3 x 4]> TRUE     
3     2 <tibble [3 x 4]> FALSE

R相关问答推荐

如何识别组内的行是否在同一列中具有值?

有没有方法将琴弦完全捕捉到R中的多边形?

如何创建构成多个独立列条目列表的收件箱框列?

向gggplot 2中的数据和轴标签添加大写和星号

R s iml包如何处理语法上无效的因子级别?'

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

从BRM预测价值

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

跨列查找多个时间报告

在列表中排列R数据框中的列顺序

提高圣彼得堡模拟的速度

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

在不对R中的变量分组的情况下取两行的平均值

访问数据帧中未定义的列时出现R错误

如何从嵌套数据中自动创建命名对象?在R中

名字的模糊匹配

按镜像列值自定义行顺序

每行不同列上的行求和