假設列character
類,通過除了第一個列環,和replace
的「L」與numeric
元件min
值,然後將其轉換爲numeric
類。
df1[-1] <- lapply(df1[-1], function(x) as.numeric(replace(x,
x=="L", min(as.numeric(x), na.rm = TRUE))))
df1
# v1 v2 v3 v4 v5
#1 A 4 6 5 3
#2 B 4 6 9 3
#3 C 6 7 6 5
#4 D 4 8 5 3
順便說一句,使用lapply
建議過apply
因爲後者轉換到matrix
。
或者使用dplyr
library(dplyr)
df1 %>%
mutate_each(funs(replace(., .=="L", min(.))), 2:5)
# v1 v2 v3 v4 v5
#1 A 4 6 5 3
#2 B 4 6 9 3
#3 C 6 7 6 5
#4 D 4 8 5 3
或者使用set
從data.table
這是非常有效的
library(data.table)
setDT(df1)
for(j in 2:ncol(df1)){
set(df1, i = which(df1[[j]]=="L"), j=j, value = min(df1[[j]]))
}
df1
# v1 v2 v3 v4 v5
#1: A 4 6 5 3
#2: B 4 6 9 3
#3: C 6 7 6 5
#4: D 4 8 5 3
謝謝!第一個解決方案效果很好。我的'真實'數據中存在一些值,我忽略了在我的例子中將複雜的問題 - 例如NAs和3和10在同一列中選擇10作爲字符評估。你的代碼工作完美! – rshaw