R - 基于一个向量分配多个值(如果 x = 1,则设置这些变量 = -99)
R - Assigning multiple values based on one vector (if x = 1, set these variables = -99)
我在尝试根据另一个变量的值将多个变量设置为特定值 (-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 是 "Blue",我最终会做几个这样的语句......
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 循环,但没有太大用处,我的一些尝试围绕语句展开,例如这个..
for(i in x$v2:v5){
i[x$v1 == "Blue"] <- -99
}
如果有人可以帮助我完成我在这里尝试做的事情,我将不胜感激。我在想我可能想得太多了,并且能够使用 apply 函数族来做这样的事情。
输出,应该是这样的..
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)
再次感谢大家!
我们可以使用逻辑索引 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)
}
我在尝试根据另一个变量的值将多个变量设置为特定值 (-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 是 "Blue",我最终会做几个这样的语句......
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 循环,但没有太大用处,我的一些尝试围绕语句展开,例如这个..
for(i in x$v2:v5){
i[x$v1 == "Blue"] <- -99
}
如果有人可以帮助我完成我在这里尝试做的事情,我将不胜感激。我在想我可能想得太多了,并且能够使用 apply 函数族来做这样的事情。
输出,应该是这样的..
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)
再次感谢大家!
我们可以使用逻辑索引 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)
}