2

我必须在数据表中执行逐行逻辑操作,让我用例子来解释一下。假设我有如下给出的数据表(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 循环来执行此操作,但这样做的效率非常低。

4

3 回答 3

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")
于 2013-06-19T10:05:35.040 回答
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,这实际上与 write 相同DT[, V6 := 1]

于 2013-06-19T14:50:51.700 回答
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))))))
于 2013-06-19T10:51:21.103 回答