我必须在数据表中执行行方式逻辑运算,让我用例子解释一下。假设我有数据表(DT),如下所示
V1 V2 V3 V4 V5
AAE CDG 2 0 0
AAE CDG 2 5 5
AAE ORY 2 4 4
AAE ORY 2 0 0
AAE ORY 2 5 5
AAE ORY 2 3 3
现在,根据V5的值,我想在数据表中添加额外的列V6,这是逻辑运算。我做了这样的事情 -
DT[, V6 := if(V5 == 0){1
}else if(V5 == 1){2
}else if(V5 == 2){3
}else if(V5 == 3){4
}else if(V5 == 4){5
}else if(V5 == 5){6}
]
但这并没有给出理想的结果,应该是
V1 V2 V3 V4 V5 V6
AAE CDG 2 0 0 1
AAE CDG 2 5 5 6
AAE ORY 2 4 4 5
AAE ORY 2 0 0 1
AAE ORY 2 5 5 6
AAE ORY 2 3 3 4
然后给出以下结果 -
V1 V2 V3 V4 V5 V6
AAE CDG 2 0 0 1
AAE CDG 2 5 5 1
AAE ORY 2 4 4 1
AAE ORY 2 0 0 1
AAE ORY 2 5 5 1
AAE ORY 2 3 3 1
这是因为V5的第一个值(为0)用于逻辑运算,而不是一次动态使用一个值或行值。如何更改[,J]参数以获得所需结果。我可以使用for循环来做到这一点,但这样做非常有效。
答案 0 :(得分:2)
你为什么不这样做
dat <- read.table(text= "V1 V2 V3 V4 V5
+ AAE CDG 2 0 0
+ AAE CDG 2 5 5
+ AAE ORY 2 4 4
+ AAE ORY 2 0 0
+ AAE ORY 2 5 5
+ AAE ORY 2 3 3 ",header=TRUE)
dat$V6 <- dat$V5 + 1
正如@Steph所说,您可以按如下方式创建映射表,然后合并列。
mapping <- data.frame(V5=c(0,1,2,3,4,5),V6=c(1,2,3,4,5,6))
merge(dat,mapping,by="V5")
答案 1 :(得分:2)
到目前为止,其他答案都是data.frame
语言。使用data.table
语言,您应该使用DT[, V6 := ifelse...]
而不是DT$V6 <- ifelse...
而使用[
代替调用merge
:
setkey(DT, V5)
DT[J(V5 = 0:5, V6 = 1:6), nomatch = 0]
但至少在OP的例子中,解决方案看起来很简单:
DT[, V6 := V5 + 1]
哦,以及if/else
不起作用的原因是因为if/else
不对向量进行操作,它只是取向量V5
的第一个值,这确实是0
,并返回1
,这与撰写DT[, V6 := 1]
实际上相同。
答案 2 :(得分:1)
试试这个:
dat <- read.table(
text= "V1 V2 V3 V4 V5
AAE CDG 2 0 0
AAE CDG 2 5 5
AAE ORY 2 4 4
AAE ORY 2 0 0
AAE ORY 2 5 5
AAE ORY 2 3 3",header=TRUE)
dat$V6 <- ifelse(dat$V5 == 0,1,
ifelse(dat$V5 == 1,2,
ifelse(dat$V5 == 2,3,
ifelse(dat$V5 == 3,4,
ifelse(dat$V5 == 4,5,
ifelse(dat$V5 == 5,6,NA))))))