【问题标题】:Scan a column to find value over a certain value, and move the entire column into a new dataframe in R扫描一列以查找超过某个值的值,并将整个列移动到 R 中的新数据框中
【发布时间】:2018-05-29 06:01:41
【问题描述】:
x<-matrix(c(0.00009852, -0.00393314, -0.00049056, -0.00117636, 
-0.00283716,  0.00136866, -0.00536613, -0.00068090, 0.01528542, 
0.01221890, -0.00309366, 0.00379356,-0.00159904, -0.00259300, 
-0.00635427,  0.00446363,0.00119367,  0.00079657,  0.00419246,  
0.00090068,0.00160321,0.00623682, -0.00010090, -0.00070604),ncol=4)

x<-data.frame(x)
names(x)<-c("active","inactive","injured","rehab")


   active        inactive     injured      rehab
1 0.00009852   -0.00536613  -0.00159904  0.00419246
2 -0.00393314  -0.00068090  -0.00259300  0.00090068
3 -0.00049056  0.01528542   -0.00635427  0.00160321
4 -0.00117636  0.01221890    0.00446363  0.00623682
5 -0.00283716  -0.00309366   0.00119367 -0.00010090
6 0.00136866   0.00379356     0.00079657 -0.00070604

所以我有一个名为 (x) 的数据集。 我想要

1) 找出每一列的异常值

2) 如果有任何值高于/低于异常值,则扫描列

3) 将具有异常值的列移动到名为 y 的新数据框中。

任务1,我使用如下:

quantile1<-function(k){
quantile(k, 0.25)+IQR(k)
}

quantile3<-function(k){
quantile(k,0.75)+IQR(k)
}

lower_outlier<-apply(x, 2, quantile1)
upper_outlier<-apply(x, 2, quantile3)

View(t(lower_outlier))
   active       inactive    injured     rehab
-0.000048750  0.010112565 0.001094395  0.003545148

View(t(upper_outlier))
   active       inactive    injured     rehab
0.00232446    0.0227156    0.0045333   0.0069408

所以现在我为每列设置了异常值上限和下限。如何进行任务 2 和 3?我相信其中一种方法类似于

x <- x[x <= value]

但我不确定。任何建议都非常感谢

【问题讨论】:

  • 你能显示预期吗?尝试i1 &lt;- colSums(x &gt; upper_outlier[col(x)] | x &lt; lower_outlier[col(x)]) &gt; 0] 如果要查找具有任何异常值的列,则数据集中的所有列都显示该行为.. y &lt;- x[,i1, with = FALSE]
  • @akrun 我没有预期的答案哈哈,这是一个更大的集合的虚拟集合,所以我根本不知道.....
  • @akrun 是的,第一行有效,第二行无效。也许我误解了这个问题.....也许我应该删除高于上/下异常值的值......
  • 对不起,在那种情况下y &lt;- x[, !i1, with = FALSE]

标签: r data-cleaning outliers


【解决方案1】:

我们可以在使比较对象的长度相同(通过复制)后,用关系运算符创建一个逻辑矩阵,然后得到矩阵的colSums,取反(!),这样有0个异常值的列将是TRUE 和其他 FALSE

i1 <- !colSums(x > upper_outlier[col(x)] | x < lower_outlier[col(x)])

根据索引对数据集列进行子集

y <- x[, i1, drop = FALSE]

【讨论】:

  • [.data.frame(x, , i1, with = FALSE) 中的错误:第二行的未使用参数 (with = FALSE)
  • @MT32 对不起,我忘了它是一个 data.frame 而不是一个 data.table。它是drop = FALSE。例如,您将获得 0 列
猜你喜欢
  • 2019-01-20
  • 2018-06-07
  • 2013-07-06
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多