尝试根据另一个变量的值将多个变量设置为特定值(-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)
再次感谢大家!
答案 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)
}