通过R

时间:2018-08-24 10:38:13

标签: r dplyr data.table plyr

我有下一个数据

    mydat=structure(list(group = c(111L, 111L, 111L, 111L, 111L, 111L, 
111L, 333L, 333L, 333L, 333L, 333L, 333L, 333L, 555L, 555L, 555L, 
555L, 555L, 555L, 555L), group2 = c(222L, 222L, 222L, 222L, 222L, 
222L, 222L, 444L, 444L, 444L, 444L, 444L, 444L, 444L, 666L, 666L, 
666L, 666L, 666L, 666L, 666L), action = c(0L, 0L, 0L, 1L, 1L, 
0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L
), x1 = c(1L, 2L, 3L, 0L, 0L, 1L, 2L, 1L, 2L, 3L, 0L, 0L, 1L, 
2L, 1L, 2L, 3L, 10L, 20L, 1L, 2L)), .Names = c("group", "group2", 
"action", "x1"), class = "data.frame", row.names = c(NA, -21L
))

这里有两个组变量(group和group2)。 一共有三组

111 222
333 444
555 666

操作列只能取值0和1。

所以我需要找到这些组,其中对于1类动作,它们的x1值只有零。 在我们的情况下是

111 222
333 444

因为所有1类动作的x1都为零。 因此,我只能与555 666组一起工作。 因为它的x1变量至少具有一个第一类动作的非零值。

所需的输出 Mydat1在这里通过x1变量将第一类动作的至少一个非零值分组。

group   group2  action  x1
555      666    0   1
555      666    0   2
555      666    0   3
555      666    1   **10**
555      666    1   **20**
555      666    0   1
555      666    0   2

mydat2组,对于所有1类操作,它们的x值均为0

group   group2  action  x1
111      222    0   1
111      222    0   2
111      222    0   3
111      222    1   **0**
111      222    1   **0**
111      222    0   1
111      222    0   2
333      444    0   1
333      444    0   2
333      444    0   3
333      444    1   **0**
333      444    1   **0**
333      444    0   1
333      444    0   2

1 个答案:

答案 0 :(得分:1)

如果我答对了,那么您的问题是:

  

我需要找到这些小组,其中有1类行动   x1只能是零值。

所以这是响应:

library(tidyverse)
mydat  %>%
  group_by( action ) %>%
  filter( action==1 & x1==0 )

,响应为:

  group group2 action    x1
  <int>  <int>  <int> <int>
1   111    222      1     0
2   111    222      1     0
3   333    444      1     0
4   333    444      1     0

这段代码是做什么的?

它查看action功能,并为所有行(0和1)考虑2个主要类别。然后,它过滤掉通过action==1 & x1==0的观测值。因此,这意味着,在具有action==1的那些行中,x1==0也是如此。

  

脚本可以返回555 + 666组的所有值吗?

。它不会返回这两个组。而且它不应该那样做。让我们编写一个过滤555和666的代码

library(tidyverse)
mydat  %>%
  group_by( action ) %>%
  filter( group==555 | group2==666 )

结果是:

group group2 action    x1
  <int>  <int>  <int> <int>
1   555    666      0     1
2   555    666      0     2
3   555    666      0     3
4   555    666      1    10
5   555    666      1    20
6   555    666      0     1
7   555    666      0     2

因此,如您所见,这些观察都没有满足条件action==1 & x1==0。因此,它们不在有效响应之内。