我可以找到许多关于根据阈值有条件地替换(或多个(列的值的问题。
但是,我想解决的是用指定的值替换较小(或较大(的值。 例如,在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))]