在R中循环序列(标准化和winsorize数据帧)

时间:2016-08-07 17:14:31

标签: r loops dataframe standardized

我正在尝试在r中为数据帧循环这一系列步骤。 这是我的数据:

ID  Height  Weight    
a   100  80    
b  80  90    
c  na  70    
d  120  na    
.... 

到目前为止,这是我的代码

winsorize2 <- function(x) {        
Min <- which(x == min(x))
Max <- which(x == max(x))
ord <- order(x)
x[Min] <- x[ord][length(Min)+1]
x[Max] <- x[ord][length(x)-length(Max)]
x}

df<-read.csv("data.csv")
df2 <- scale(df[,-1], center = TRUE, scale = TRUE)
id<-df$Type
full<-data.frame(id,df2) 
full[is.na(full)] <- 0
full[, -1] <- sapply(full[,-1], winsorize2)

我想要做的是: - &gt;标准化数据帧,然后使用函数winsorize2对标准化数据帧进行winsorize,即用最小极值替换最极端值。然后重复10次。我该怎么做这个循环?我很困惑,因为在序列中我已经用0替换了nas,所以我也应该从循环中删除这一步?

编辑:在与@ekstroem讨论后,我们决定改用代码来引入边界

df<-read.csv("data.csv")  
id<-df$Type  
df2<- scale(df[,-1], center = TRUE, scale = TRUE)  
df2[is.na(df2)] <- 0
df2[df2<=-3] = -3
df2[df2>=3] = 3

df3<-df2  #trying to loop again
df3<- scale(df3, center = TRUE, scale = TRUE)  
df3[is.na(df3)] <- 0  
df3[df3<=-3] = -3  
df3[df3>=3] = 3  

1 个答案:

答案 0 :(得分:1)

您的代码中有一些未完全指定的边界问题,但可能会使用以下内容(使用基本R而非超级效率)

wins2 <- function(x, n=1) { 
    xx <- sort(unique(x)) 
    x[x<=xx[n]] <- xx[n+1]
    x[x>=xx[length(xx)-n]] <- xx[length(xx)-n]
    x 
}

这会产生:

x <- 1:11
wins(x,1)
[1]  2  2  3  4  5  6  7  8  9 10 10
wins(x,3)
[1] 4 4 4 4 5 6 7 8 8 8 8