如何以R中的分组行为条件编写新列?

时间:2016-06-01 18:28:42

标签: r dplyr tidyr

我有一个数据框,其中每个有三个类别(a,b,c),并且每个类别的数字答案都会被记录(0或1) 。我想根据答案列中的行创建一个新列。这就是我的数据框的样子:

Item     <- rep(c(1:3), each=3)
Option   <- rep(c('a','b','c'), times=3)
Answer   <- c(1,1,0,1,0,1,1,1,1)
df       <- data.frame(Item, Option, Answer)


  Item Option Answer
1    1      a      1
2    1      b      1
3    1      c      0
4    2      a      0
5    2      b      0
6    2      c      1
7    3      a      1
8    3      b      1
9    3      c      1

需要什么:只要选项列中的三个类别为1,列就会收到1.在任何其他情况下,该列应具有0.所需的输出应如下所示:

  Item Option Answer New
1    1      a      1   0
2    1      b      1   0
3    1      c      0   0
4    2      a      0   0
5    2      b      0   0
6    2      c      1   0
7    3      a      1   1
8    3      b      1   1
9    3      c      1   1

我试图在不使用循环的情况下实现这一点,但是我被卡住了,因为我不知道如何根据一组行创建一个新列,而不仅仅是一个行。我尝试了this solution但如果行没有成对分组则不起作用。

你有什么建议吗?谢谢你!

3 个答案:

答案 0 :(得分:4)

这应该有效:

df %>%
  group_by(Item)%>%
  mutate(New = as.numeric(all(as.logical(Answer))))

答案 1 :(得分:3)

使用data.table

DT <- data.table(Item, Option, Answer)
DT[, Index := as.numeric(all(as.logical(Answer))), by= Item]
DT

    Item Option Answer Index
1:    1      a      1     0
2:    1      b      1     0
3:    1      c      0     0
4:    2      a      1     0
5:    2      b      0     0
6:    2      c      1     0
7:    3      a      1     1
8:    3      b      1     1
9:    3      c      1     1

答案 2 :(得分:2)

或仅使用base R

df$Index <- with(df, +(ave(!!Answer, Item, FUN = all)))
df$Index
#[1] 0 0 0 0 0 0 1 1 1