我想以矢量化方式更改多列值基本单元格条件。我知道如何一列一列地更改值,但如何同时更改两列以上。例如,如果col1或col2 <3,我们要将这些单元格设置为99。
col1<-seq(1,5)
col2<-(1:5)
col3<-10:14
df<-data.frame(col1,col2,col3)
df[df[,1:2]<5]<-99 ##wrong, but it works for a single column
ifelse(df[,1:2]<5,99,??) # i dont know how to set the value to the original values here
# works for single column
df[df$col1<5,1]<-99
df[df$col2<5,2]<-99
> df
col1 col2 col3
1 99 99 10
2 99 99 11
3 99 99 12
4 99 99 13
5 5 5 14
答案 0 :(得分:2)
我们根据两列获得了matrix
个逻辑元素,即TRUE/FALSE
。因此,如果我们需要对两列的元素进行子集化,请仅选择那些列以对元素进行子集并将其分配给999
df[1:2][df[1:2] < 5] <- 999
如果我们拆分代码并检查各个组件,即
,这可以说清楚1)逻辑元素矩阵
df[1:2] < 5
# col1 col2
#[1,] TRUE TRUE
#[2,] TRUE TRUE
#[3,] TRUE TRUE
#[4,] TRUE TRUE
#[5,] FALSE FALSE
2)选择感兴趣的列,以满足逻辑矩阵
中满足条件的那些列 df[1:2][df[1:2] < 5]
#[1] 1 2 3 4 1 2 3 4
想象一下,如果我们在整个数据集上应用它。然后,尺寸/长度不一样。在某些情况下,如果原始数据集中的列数是逻辑矩阵列的倍数,它甚至可以通过重新计算来解决(因此要注意这种可能性)
3)将值分配给999
可以在ifelse
上使用vector
。因此,遍历列然后执行赋值
df[1:2] <- lapply(df[1:2], function(x) ifelse(x < 5, 999, x))
或replace
df[1:2] <- lapply(df[1:2], function(x) replace(x, x < 5, 999))