【发布时间】:2018-01-29 20:23:33
【问题描述】:
我在 R 中有一个 data.table,要按一列的值进行分组,并找到每组中的异常值。但我需要保留 id 列(不包含在聚合中)。比如下面的数据表a,我想按类找出Hours的异常值,并输出对应的id。
Hours id class
1: 100.000 30298340 M
2: 4.776 30310183 M
3: 1.560 30312576 M
4: 11.520 30336159 M
5: 3.288 30331383 M
6: 6.552 30364533 M
7: 5.064 30365224 M
8: 27.768 30365394 C
9: 4.992 30365211 M
10: 25.536 30365603 M
11: 8.568 30337051 M
12: 5.112 30337052 C
13: 2.352 30284703 M
14: 23.784 30325405 M
15: 16.464 30327152 M
16: 24.336 30351237 M
17: 3.192 30352117 M
18: 24.312 30324926 M
19: 23.160 30325670 M
20: 4.176 30324906 M
然后我使用以下代码查找异常值。
temp<-a[,.(Hours=boxplot.stats(Hours,coef=3,do.conf=F)$out,M=boxplot.stats(Hours,do.conf=F
)$stats[3]),by=class]
temp[Hours>M] 会给我高于中位数和中位数的异常值作为参考。
class Hours M
1: M 100 7.56
但是如何更改聚合行以包含异常行的 id?
由于我的原始表非常大,我不想将临时表与原始数据合并。另外,因为这只是现有大型程序的一小部分,所以我试图保留 temp 结果的主要结构,并添加了 id 列,以便将 temp 传递到下一个计算块中。理想情况下,是否有一种简单的方法来调整 data.table 聚合线以满足我的要求?谢谢!!!
这是相同场景中的一个附加问题。现在,如果我在原始数据中还有 3 列,即年龄、性别等。我怎样才能将它们全部保留在异常值输出中?我可以简单地重复 Eric 的代码,将 id 替换为其他变量并添加到 data.table 步骤中:
age=age[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)],
gender=gender[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)],
但是如果要添加更多的列,这将是一项乏味的工作。我正在考虑执行以下操作:
keyname<-c("age", "gender","id")
temp <- a[, .(Hours = boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out,
M = boxplot.stats(Hours, do.conf = FALSE)$stats[3],
lapply(c(1:length(keyname)),function(x) keyname[x]=get(keyname[x])[which(Hours) %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)]),
by = class]
但是,它不起作用。有什么进一步的建议吗?谢谢!
【问题讨论】:
-
由于 'id' 是唯一的,使用
:=创建 'Hours' 列 -
如果你只想通过保持 Hours > median(Hours) 来对数据进行子集化,那么你可以使用这个:subset(df, df$Hours>median(df$Hours))。
-
@user108363 我猜他们想要根据
class计算的中位数(或其他任何东西),因为他们写了by=class。 -
@Frank 谢谢,我错过了。然后,您可以尝试类似: library(dplyr) new_df %group_by(class) %>% summarise(median_hours_by_class= median(Hours), Hours=Hours, class=class, id=id) subset(new_df , new_df$Hours>new_df$median_hours_by_class)
-
您好 user1083637,我需要按类别划分中位数以上的异常值,而不仅仅是中位数以上的数据点。但是您通过使用 dplyr 为我提供了一个很好的示例/可能的方式。谢谢。
标签: r data.table