R:根据常见的ifelse条件重新编码多个变量

时间:2012-03-07 10:51:30

标签: r

假设我的数据集包含3个变量:

V1 V2 V3
1  a   b
1  c   g
2  e   c
3  d   a
4  w   e

当V1等于1时,有没有办法同时将V2和V3的值更改为“x”和“y”?换句话说,我想避免这样做:

V2 = ifelse(V1==1, 'x', V2)
V3 = ifelse(V1==1, 'y', V3)

3 个答案:

答案 0 :(得分:4)

这是一种同时执行此操作的方法,但它仍然需要ifelse语句,因此它不会变得更少代码。你可以一次只做一个。

foo <- read.table(textConnection("V1 V2 V3
1  a   b
1  c   g
2  e   c
3  d   a
4  w   e"),header=TRUE,stringsAsFactors=FALSE)

transform(foo, V2 = ifelse(V1==1, 'x', V2), V3 = ifelse(V1==1, 'y', V3))

返回:

  V1 V2 V3
1  1  x  y
2  1  x  y
3  2  e  c
4  3  d  a
5  4  w  e

答案 1 :(得分:1)

我认为两次测试条件没有任何真正的方法。可能会略有改善

V2[V1 == 1] <- 'x'
V3[V1 == 1] <- 'y'

因为这可以避免ifelse的开销(具体来说,它会计算测试向量中每个元素的真假结果,然后将结果拼接在一起)。虽然您可以使用

进行一次测试
for(i in seq_along(V1))
    if(V1[i] == 1) {
        V2[i] <- 'x'
        V3[i] <- 'y'
    }

但我猜你真的不想这样做。

答案 2 :(得分:0)

未经测试,但要修改Hong的答案,我猜是

data[data$V1 ==1,] <- c(1,'x','y')

如果不允许这样做,那么用基本相同的东西替换Hong for循环的内容,即

 data[data$V1==1,2:3] <- c('x','y')

(感谢Wojciech Sobala对此改进的评论)