我有一个数据帧(强度),其中我想用0替换行方式阈值以下的所有值。阈值是相应行的最大值的80%。结果应作为新数据框进行保护
我试过了:
cutoff <- function(x){
x[x < 0.8* max(x)] <- 0
}
filter_int <- t(apply(X= intensities, MARGIN = 1, FUN= cutoff))
运行此命令,filter_int是一行,全部为零。有任何想法吗?
答案 0 :(得分:0)
经典问题。 R函数返回最后一行返回的值。如果您指定了某些内容,R将无形地返回您指定的值。在您的情况下,这是0
。
添加一个显式的return语句来解决这个问题:
cutoff <- function(x){
x[x < 0.8* max(x)] <- 0
return(x)
}
如果您使用apply
,请记住它会返回一个矩阵,在这种情况下每个变量都有一行。因此,您必须转置它,然后使用data.frame()
返回数据框。由于for
循环与几年前相比有很多优化,因此实际上更快:
df <- as.data.frame(
replicate(10, sample(1:100,100))
)
df2 <- df
for(i in seq_len(nrow(df))){
df2[i,] <- cutoff(df[i,])
}