R:循环以在多个列上重复相同代码

vuktfyat  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(173)

我有一个关于R中循环的问题。我的数据包含2000行,其中有2000个个体。我有37列,其中有37个连续变量的不同信息。我想用tuckey方法识别37个变量的离群值。
这里的代码我使用的一列:

iqr <- IQR(mydata$x)
q1  <- quantile(mydata$x)[[2]]
q2  <- quantile(mydata$x)[[3]]
q3  <- quantile(mydata$x)[[4]]

mydata$Medium_Outliers_low <- ifelse(mydata$x< q1-1.5*iqr,1,0)
mydata$Medium_Outliers_high <- ifelse(mydata$x> q3+1.5*iqr,1,0)
mydata$Extremes_Outliers_low <- ifelse(mydata$x < q1-3*iqr,1,0)
mydata$Extremes_Outliers_high <- ifelse(mydata$x > q3+3*iqr,1,0)

我想为我的37个变量重复这段代码,所以我将为37个变量中的每一个创建4个变量(Medium_Outliers_low和co),所以创建一个包含148个变量的数据库。
我尝试一个循环:

for (i in 4:41){
  iqr <- IQR(mydata[[i]])
  q1  <- quantile(mydata[[i]])[[2]]
  q2  <- quantile(mydata[[i]])[[3]]
  q3  <- quantile(mydata[[i]])[[4]]
  mydata$Medium_Outliers_low <- ifelse(mydata[[i]]< q1-1.5*iqr,1,0)
  mydata$Medium_Outliers_high <- ifelse(mydata[[i]]> q3+1.5*iqr,1,0)
  mydata$Extremes_Outliers_low <- ifelse(mydata[[i]]< q1-3*iqr,1,0)
  mydata$Extremes_Outliers_high <- ifelse(mydata[[i]]> q3+3*iqr,1,0)

但是我只创建了4个变量(Medium_Outliers_low和co)。所以我想请你帮助创建一个循环来重复代码,因为我不知道这样做。我搜索了类似的问题,但没有找到任何东西。非常感谢!!!C。

6uxekuva

6uxekuva1#

原因是Outliers列在每次迭代中都会被覆盖,并返回上一次迭代的输出。paste最好使用索引或列名来唯一标识每个列。

for (i in 4:41){
  iqr <- IQR(mydata[[i]])
  qtl <- quantile(mydata[[i]])
  q1  <- qtl[[2]]
  q2  <- qtl[[3]]
  q3  <- qtl[[4]]
  nm1 <- names(mydata)[i]
  mydata[[paste0(nm1, "_Medium_Outliers_low")]] <- 
      ifelse(mydata[[i]]< q1-1.5*iqr,1,0)
  mydata[[paste0(nm1, "_Medium_Outliers_high")]] <- 
     ifelse(mydata[[i]]> q3+1.5*iqr,1,0)
  mydata[[paste0(nm1, "_Extremes_Outliers_low")]] <- 
      ifelse(mydata[[i]]< q1-3*iqr,1,0)
  mydata[[paste0(nm1, "_Extremes_Outliers_high")]] <- 
      ifelse(mydata[[i]]> q3+3*iqr,1,0)
}

相关问题