对数据帧的每个元素执行ifelse(),但对R中的每个列执行不同的测试

对数据帧的每个元素执行ifelse(),但对R中的每个列执行不同的测试,r,dataframe,apply,R,Dataframe,Apply,我有一个大数据帧[4000600],如果元素小于每列最大值的三个数量级,我想将元素转换为0。因此,需要将每个元素与其列的最大值进行比较,如果元素

我有一个大数据帧[4000600],如果元素小于每列最大值的三个数量级,我想将元素转换为0。因此,需要将每个元素与其列的最大值进行比较,如果元素<0.001*$column_max,则应将其转换为0,如果不是,则应保持不变


我很难让apply()允许我使用ifelse()函数。我是否缺少更好的方法或功能??我对R相当陌生。

使用
lappy
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

dat使用
lappy
使用
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

dat如果使用apply column wise(按列应用),则应使用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)})

df如果使用apply column wise(按列应用),则应使用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)})

df我们可以在不使用
ifelse的情况下执行此操作

library(dplyr)
dat %>% 
    mutate_each(funs((.>= 0.001*max(.))*.))
#     a    b
#1    0    0
#2    2    4
#3 1001 3003
数据
dat我们不需要使用
ifelse

library(dplyr)
dat %>% 
    mutate_each(funs((.>= 0.001*max(.))*.))
#     a    b
#1    0    0
#2    2    4
#3 1001 3003
数据
dat如果你想要一个好答案,我建议你发布一段代码。如果你想要一个好答案,我建议发布一段代码。