R 在列表中重新编码变量

R 在列表中重新编码变量,r,dplyr,data.table,R,Dplyr,Data.table,我有X列的数据,希望使用此规则重新编码: 如果X等于1,5,6,9,那么Y等于1;如果X等于2,3,4,那么Y等于0;如果X等于7,8,那么Y等于2。我想知道,不使用“if”语句如何做到这一点。可能在dplyr上,例如data.table。如果 data=data.frame(X=c(1,2,3,4,5,6,7,8,9), Y = c(1,0,0,0,1,1,2,2,1)) 查看来自dplyr@MrFlick的case\u when函数我查看了来自dplyr的c

我有X列的数据,希望使用此规则重新编码:
如果X等于1,5,6,9,那么Y等于1;如果X等于2,3,4,那么Y等于0;如果X等于7,8,那么Y等于2。我想知道,不使用“if”语句如何做到这一点。可能在dplyr上,例如data.table。

如果

data=data.frame(X=c(1,2,3,4,5,6,7,8,9),
                Y = c(1,0,0,0,1,1,2,2,1))

查看来自
dplyr
@MrFlick的
case\u when
函数我查看了来自dplyr的case\u when函数,但看到值是单独列出的。您不想像这样单独列出值吗<代码>数据%>%发生变异(Y=case_当(X%在%c(1,5,6,9)~1,X%在%c(2:4)~0,X%在%c(7,8)~2))?在
数据中也有类似的
fcase
。如果代码中没有列出值,该怎么办?例如,如果您想说“如果列中的值不是所列的值之一,那么将其设置为999”?您可以对所有剩余的值使用条件
TRUE
data%>%mutate(Y=case_,当(X%in%c(1,5,6,9)~1,X%in%c(2:4)~0,X%in%c(7,8)~2,TRUE~999))
非常感谢它的魅力。你知道data.table解决方案吗,因为数据很大?@bOver这也适用于
数据。table
setDT(data)[,Y:=1*(X%在%v1)+0*(X%在%v2)+2*(X%在%v3)]
@Ronak Shah这很好,我的最后一个问题是如何为未列出的值添加一个类别,比如值5?
v1 <- c(1,5,6,9)
v2 <- c(2,3,4)
v3 <- c(7,8)

dfout <- within(data,Y <- 1*(X %in% v1) + 0*(X %in% v2) + 2*(X %in% v3))
> dfout
  X Y
1 1 1
2 2 0
3 3 0
4 4 0
5 5 1
6 6 1
7 7 2
8 8 2
9 9 1