假设我的数据集包含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)
答案 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对此改进的评论)