使用 R 中的矢量化代码比较和替换多个列之间的值



我可以找到许多关于根据阈值有条件地替换(或多个(列的值的问题。

但是,我想解决的是用指定的值替换较小(或较大(的值。 例如,在swiss数据集中,我想比较最后两列(即天主教和婴儿死亡率(,并将较小的值替换为每行的 999。

>   swiss[1:5, c(ncol(swiss), (ncol(swiss) - 1))]
Infant.Mortality Catholic
Courtelary               22.2     9.96
Delemont                 22.2    84.84
Franches-Mnt             20.2    93.40
Moutier                  20.3    33.77
Neuveville               20.6     5.16
<some code I want to write>
### the expected result
Infant.Mortality Catholic
Courtelary               22.2     999
Delemont                 999    84.84
Franches-Mnt             999    93.40
Moutier                  999    33.77
Neuveville               20.6     999

我想我可以使用for语句或其他循环方法(例如逐行apply(进行比较和替换.
但是,我将处理超大数据(例如数亿个观察(,所以我想找到一种方法来快速完成它(例如矢量化(。

谢谢

获取每行的最小索引,创建一个行/列矩阵并将其替换为 999。

df[cbind(1:nrow(df), apply(df, 1, which.min))] <- 999
df
#             Infant.Mortality Catholic
#Courtelary               22.2   999.00
#Delemont                999.0    84.84
#Franches-Mnt            999.0    93.40
#Moutier                 999.0    33.77
#Neuveville               20.6   999.00

如果apply(df, 1....太慢,您可以使用max.col

df[cbind(1:nrow(df), max.col(-df))] <- 999

数据

df <- swiss[1:5, c(ncol(swiss), (ncol(swiss) - 1))]

最新更新