如果 R 中不为 0,则提取帧行中的最小值
Extract minimum value in frame row if not 0 in R
我想确定一行中的所有值是否都是 0,如果是,则 return 0,否则 return 行中不为 0 的最小值。例如:
dat <- data.frame(x = c(0,0,0), y = c(0,1,0), z = c(0,0,2))
在这里,我希望函数return 向量(0,1,2,)。我已经尝试过类似的方法,但没有成功:
apply(dat,1, function(x) ifelse(x==0, 0, min(x)[x!=0]))
任何和所有的想法表示赞赏。
你可以试试
indx <- !!rowSums(dat!=0)
is.na(dat[indx,]) <- dat[indx,]==0
do.call(pmin, c(dat, na.rm=TRUE))
#[1] 0 1 2
或者不改变原始数据集
library(car)
recode(do.call(pmin, c((NA^!dat)*dat, na.rm=TRUE)), 'NA=0')
#[1] 0 1 2
或者您可以将您所做的更改为:
apply(dat,1, function(x) ifelse(sum(x)==0, 0, min(x[x!=0])))
[1] 0 1 2
我想确定一行中的所有值是否都是 0,如果是,则 return 0,否则 return 行中不为 0 的最小值。例如:
dat <- data.frame(x = c(0,0,0), y = c(0,1,0), z = c(0,0,2))
在这里,我希望函数return 向量(0,1,2,)。我已经尝试过类似的方法,但没有成功:
apply(dat,1, function(x) ifelse(x==0, 0, min(x)[x!=0]))
任何和所有的想法表示赞赏。
你可以试试
indx <- !!rowSums(dat!=0)
is.na(dat[indx,]) <- dat[indx,]==0
do.call(pmin, c(dat, na.rm=TRUE))
#[1] 0 1 2
或者不改变原始数据集
library(car)
recode(do.call(pmin, c((NA^!dat)*dat, na.rm=TRUE)), 'NA=0')
#[1] 0 1 2
或者您可以将您所做的更改为:
apply(dat,1, function(x) ifelse(sum(x)==0, 0, min(x[x!=0])))
[1] 0 1 2