簡體   English   中英

使用 R 中的矢量化代碼比較和替換多列之間的值

[英]Compare and replace values among multiple columns using a vectorized code in R

我可以找到許多關於基於閾值有條件地替換一個(或多個)列的值的問題。

但是,我要解決的是將較小(或較大)的值替換為指定值。 例如,在swiss數據集中,我想比較最后兩列(即天主教和 Infant.Mortality)並將每行的較小值替換為 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語句或其他循環方法(例如 row-wise 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))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM