如何在 R 中以分组行为条件编写新列?
How to write new column conditional on grouped rows in R?
我有一个数据框,其中每个 Item 具有三个类别(a、b、c)和每个类别的数字 Answer被记录(0 或 1)。我想根据 Answer 列中的行创建一个新列。这是我的数据框的样子:
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
需要什么:每当 Option 列中的三个类别为 1 时,New 列应收到 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 但如果行没有成对分组,它就不起作用。
你有什么建议吗?非常感谢!
这应该有效:
df %>%
group_by(Item)%>%
mutate(New = as.numeric(all(as.logical(Answer))))
使用 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
或仅使用 base R
df$Index <- with(df, +(ave(!!Answer, Item, FUN = all)))
df$Index
#[1] 0 0 0 0 0 0 1 1 1
我有一个数据框,其中每个 Item 具有三个类别(a、b、c)和每个类别的数字 Answer被记录(0 或 1)。我想根据 Answer 列中的行创建一个新列。这是我的数据框的样子:
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
需要什么:每当 Option 列中的三个类别为 1 时,New 列应收到 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 但如果行没有成对分组,它就不起作用。
你有什么建议吗?非常感谢!
这应该有效:
df %>%
group_by(Item)%>%
mutate(New = as.numeric(all(as.logical(Answer))))
使用 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
或仅使用 base R
df$Index <- with(df, +(ave(!!Answer, Item, FUN = all)))
df$Index
#[1] 0 0 0 0 0 0 1 1 1