矢量化:根据条件更改多列的值

时间:2017-03-18 20:04:25

标签: r

我想以矢量化方式更改多列值基本单元格条件。我知道如何一列一列地更改值,但如何同时更改两列以上。例如,如果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

1 个答案:

答案 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))