R中数据表的行方式逻辑运算

时间:2013-06-19 10:00:54

标签: r data.table

我必须在数据表中执行行方式逻辑运算,让我用例子解释一下。假设我有数据表(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循环来做到这一点,但这样做非常有效。

3 个答案:

答案 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))))))