首页 > 解决方案 > 在使用 for 循环的列表中保存没有异常值的变量时出错

问题描述

我正在尝试删除数据框中变量的异常值,并以干净的方式呈现它们。由于我不能在数据框中包含不同长度的变量,并且我不想要 NA,因此我决定将变量作为向量保存在列表中。为了删除异常值,我使用了我在这里看到的方法:https ://stackoverflow.com/a/4937343/12858614 。所以这里有一个可重现的例子:

a<-c(1,4,2,2,4,3,15,2)
b<-c(3,3,6,3,4,2,5,232)
df<-data.frame(a,b)

这是一个包含 2 个变量的数据框,每个变量都有一些明显的异常值。删除异常值可以正常工作:

> df[[1]][!df[[1]] %in% boxplot.stats(df[[1]])$out]
[1] 1 4 2 2 4 3 2
> df[[2]][!df[[2]] %in% boxplot.stats(df[[2]])$out]
[1] 3 3 6 3 4 2 5

并且在变量不变的情况下使用 for 循环创建一个列表也可以:

> l1<-list()
> for (i in 1:2) {
+   l1[i]<-df[i]
+ }
> l1
[[1]]
[1]  1  4  2  2  4  3 15  2

[[2]]
[1]   3   3   6   3   4   2   5 232

当我结合这两种方法时,问题就来了:

> l2<-list()
> for (i in 1:2) {
+   l2[i]<-df[[i]][!df[[i]] %in% boxplot.stats(df[[i]])$out]
+ }
Warning messages:
1: In l2[i] <- df[[i]][!df[[i]] %in% boxplot.stats(df[[i]])$out] :
  number of items to replace is not a multiple of replacement length
2: In l2[i] <- df[[i]][!df[[i]] %in% boxplot.stats(df[[i]])$out] :
  number of items to replace is not a multiple of replacement length
> l2
[[1]]
[1] 1

[[2]]
[1] 3

我收到了这些警告,并且只有列表中每个元素的第一个数字。我该如何解决这个问题?

标签: rlistfor-loop

解决方案


推荐阅读