我想以矢量化方式更改多列值基本单元格条件。我知道如何一列一列地更改值,但如何同时更改两列以上的值。例如,如果 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
我们得到了一个基于两列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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句