x1=c(55,60,75,80)
x2=c(30,20,15,23)
x3=c(4,3,2,6)
x=data.frame(x1,x2,x3)
从这个功能:
NAins=function(x,alpha=0.3){
x.n=NULL
for (i in 1:ncol(x)){
S= sort(x[,i], decreasing=TRUE)
N= S[ceiling(alpha*nrow(x))]
x.n= ifelse(x[,i]>N, NA, x[,i])
print(x.n) }
}
如何将最终结果保存为adataframe看起来像原始数据集?但是我使用了data.frame(x.nmar)
。
以及如何从循环中获得结果?。
答案 0 :(得分:2)
最好在此使用lapply
以避免for-loop
的副作用:
NAins <- function(x,alpha=0.3){
Nr <- nrow(x)
lapply(x,function(col){
S <- sort(col, decreasing=TRUE)
N <- S[ceiling(alpha*Nr)]
ifelse(col>N, NA, col)
})
然后你可以将结果强制转换为data.frame
:
as.data.frame(NAins(dx))
答案 1 :(得分:1)
将评论转换为答案
如果你想以循环方式实现这一点,你需要预定义矩阵或数据框然后填充它(在你的情况下,你可以使用你的原始x
data.frame
,因为该函数不会更新全局环境中的原始数据集。循环结束后,您将需要返回它,因为您在函数中创建的所有变量都将被删除。 print
并未在任何地方保存。此外,在循环中运行ceiling(alpha*nrow(x))
并不合理,因为它始终保持不变。如果每次只有一个替代方案,则不需要ifelse
。见下文
NAins=function(x, alpha = 0.3){
N <- ceiling(alpha * nrow(x)) ## Run this only once (take out of the loop)
for(i in 1:ncol(x)){
S <- sort(x[, i], decreasing = TRUE)
x[x[, i] > S[N], i] <- NA # don't use `ifelse`, you only inserting one value
}
x # return the result after the loop ends
}
测试
NAins(x)
# x1 x2 x3
# 1 55 NA 4
# 2 60 20 3
# 3 75 15 2
# 4 NA 23 NA