【发布时间】:2016-02-24 01:40:27
【问题描述】:
我有一个大数据框 [4000,600],如果元素小于每列最大值的三个数量级,我想将元素转换为 0。因此,每个元素都需要与其列的最大值进行比较,如果元素
我很难让 apply() 让我使用 ifelse() 函数。我缺少更好的方法或功能吗?我对 R 很陌生。
【问题讨论】:
-
如果您想要一个好的答案,我建议您发布一段代码。
我有一个大数据框 [4000,600],如果元素小于每列最大值的三个数量级,我想将元素转换为 0。因此,每个元素都需要与其列的最大值进行比较,如果元素
我很难让 apply() 让我使用 ifelse() 函数。我缺少更好的方法或功能吗?我对 R 很陌生。
【问题讨论】:
使用lapply 通过replace 调用遍历每一列:
dat <- data.frame(a=c(1,2,1001),b=c(3,4,3003))
dat
# a b
#1 1 3
#2 2 4
#3 1001 3003
dat[] <- lapply(dat, function(x) replace(x, x < max(x)/10^3, 0) )
dat
# a b
#1 0 0
#2 2 4
#3 1001 3003
【讨论】:
如果您使用按列应用,这应该与 ifelse 一起使用:
df <- data.frame(a = c(1:10, 4000), b = c(4:13, 7000))
apply(df, 2, function(x){ifelse(x < 0.001*max(x), 0, x)})
【讨论】:
我们可以在不使用ifelse 的情况下做到这一点
library(dplyr)
dat %>%
mutate_each(funs((.>= 0.001*max(.))*.))
# a b
#1 0 0
#2 2 4
#3 1001 3003
dat <- data.frame(a=c(1,2,1001),b=c(3,4,3003))
【讨论】: