假设列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