R - 根据一个向量分配多个值(如果x = 1,设置这些变量= -99)

时间:2016-07-21 19:05:21

标签: r loops if-statement apply

尝试根据另一个变量的值将多个变量设置为特定值(-99)时,我遇到了一些问题。这经常出现在我的调查工作中。

v1 <- c("Blue","Blue","Red","Red","Blue")
v2 <- c(1,2,3,4,5)
v3 <- c(1,2,3,4,5)
v4 <- c(1,1,1,2,2)
v5 <- c(1,2,3,4,5)

x = data.frame (v1,v2,v3,v4,v5)

以此示例数据帧为例。通常,要完成设置v2 thorugh v5到-99,如果v1是“蓝色”,我最终会做几个这样的陈述......

x$v2[x$v1 == "Blue"] <- -99
x$v3[x$v1 == "Blue"] <- -99

显然,这种方法有许多缺点,特别是因为我的一些数据集可能很大。在另一个程序中,我会使用这样的语句......

(for i in v2:v5, 
if v1 = Blue, set i = -99)

我一直试图在R中使用for-loop而没有太多的利用,我的一些尝试围绕语句,例如这个......

for(i in x$v2:v5){
i[x$v1 == "Blue"] <- -99 
}

如果有人能帮助我解决我在这里尝试做的事情,我将非常感激。我想我可能会过度思考它,并且可以通过应用函数族来做类似的事情。

输出,应该是这样的..

v1 <- c("Blue","Blue","Red","Red","Blue")
v2 <- c(-99,-99,3,4,-99)
v3 <- c(-99,-99,3,4,-99)
v4 <- c(-99,-99,1,2,-99)
v5 <- c(-99,-99,3,4,-99)
x = data.frame (v1,v2,v3,v4,v5)

再次感谢大家!

1 个答案:

答案 0 :(得分:1)

我们可以使用逻辑索引x$v1 == "Blue"对行进行子集化,并使用-1删除第一列,因为它是非数字列,并将这些列分配给-99

x[x$v1 == "Blue", -1] <- -99
x
#    v1  v2  v3  v4  v5
#1 Blue -99 -99 -99 -99
#2 Blue -99 -99 -99 -99
#3  Red   3   3   1   3
#4  Red   4   4   2   4
#5 Blue -99 -99 -99 -99

来自set的有效方法是data.table。我们将'data.frame'转换为'data.table'(setDT(x)),将第2列循环到最后一列,并根据逻辑索引将set'value'转换为每列的 'i'。

library(data.table)
setDT(x)
for(j in 2:ncol(x)){
   set(x, i = which(x$v1 =="Blue"), j = j, value = -99)
}