我有一个df "merged.blood.BP.anthrop_1row“,它有250个代谢物的数据。
首先,我要检查250个代谢物(> 4*SD)中的离群值。
我创建了以下函数,并认为可以轻松地将输出保存在一个新的df中,但不能
你能帮帮忙吗
#create a function to know how many outliers we have in each metabolite
show_outliers <- function (x) {
p<-table(abs(x)>mean(x,na.rm=T)+4*sd(x,na.rm=T))
ifelse(is.na(p[2]),print (0),print(p[2]))
}
#create dataset
outliers_results<-as.data.frame(matrix(nrow = 250, ncol = 2))
names(outliers_results)<-c('metabolite', 'outliers_4_SD')
outliers_results[1:250,1]<-names(merged.blood.BP.anthrop_1row[c(1:500)])
####
for (q in c(1:250)) {
outliers_results[1:250,2]<- show_outliers(merged.blood.BP.anthrop_1row[,q])
}但似乎不起作用
我想要一个df,比如:
metabolites outliers_4_SD
Acetate 0
HDL 2
LDL 1提前谢谢你
发布于 2022-03-10 17:22:48
这里有一些可能性。请注意,我已经使用3*sd在一个小数据集中获取了一些TRUE值。
> # The function
> show_outliers <- function (x) {
+ return(abs(x - mean(x, na.rm = TRUE)) > 3 * sd(x, na.rm = TRUE))
+ }
> # Fake data
> dat <- data.frame(met = rep(c('a', 'b', 'c'), each = 10), y = rnorm(30))
> # Add a couple outliers
> dat$y[sample(1:nrow(dat), 2)] <- 40
> # Finally, a table
> table(dat$met, show_outliers(dat$y))
FALSE TRUE
a 9 1
b 9 1
c 10 0
> # Or . . .
> dat$outlier <- show_outliers(dat$y)
> # Option 1
> by(dat$outlier, dat$met, sum)
dat$met: a
[1] 1
------------------------------------------------------------
dat$met: b
[1] 1
------------------------------------------------------------
dat$met: c
[1] 0
> # Option 2
> aggregate(dat$outlier, list(dat$met), sum)
Group.1 x
1 a 1
2 b 1
3 c 0
> # Option 3
> aggregate(dat[, 'outlier', drop = FALSE], dat[, 'met', drop = FALSE], sum)
met outlier
1 a 1
2 b 1
3 c 0
> # There are other similar approaches that would work
>https://stackoverflow.com/questions/71428026
复制相似问题