查找 R 中所有特定子集的异常值?
Finding outliers for all specific subsets in R?
我的数据中有几个条件和几种测量类型。
我希望 R 分别给出每对条件和测量类型的离群值。
因此,例如,假设我有几个参与者的 3 个条件 (1-3) 和 3 种类型的度量 (A-C),每行都有一个值 x。我想要 condition1&measureA、condition2&measureB 等的值 x 的离群值。
(measure 和 condition 都是非数值的)
我试过创建循环
for(d in unique(data$measure)){
for(c in unique(data$condition)){
data %>%
filter(measure == d, condition ==c) %>%
o <- outlier(data$value) %>%
print(o)
}
}
这个想法是 R 将 运行 通过每个条件并在循环中进行测量,并且每次都挑选出与这些条件匹配的值并计算异常值。
当我 运行 整个代码时,我收到此错误消息
Error in print.default(., o) : invalid printing digits -2147483648
In addition: Warning message:
In print.default(., o) : NAs introduced by coercion to integer range
(如果我 运行 它没有循环,例如通过搜索特定条件的异常值,它也找不到第一行之后的管道函数。)
知道如何正确编码吗?
您已经在使用 dplyr
,所以我建议您使用 group_by
,因为它(对我来说)是一种更自然的数据处理方式。
此外,这部分语法不正确:
data %>%
filter(measure == d, condition ==c) %>%
o <- outlier(data$value) %>%
print(o)
为什么?
filter(...) %>%
应该通过管道传输到 接受帧的东西,但是......你正在从 [=17 发送输出=] 到 assignment o <- outlier(...)
(然后到 print(o)
,这实际上意味着 print(., o)
其中 .
是前一个的输出命令。
此外,由于 o
在第一次运行时尚未定义...您应该会收到有关 object 'o' not found
的错误消息。你不会在循环中的后续传递中得到它,因为它确实存在......但如果是这样那么它就是循环中 previous 迭代的异常值。当然不是你应该使用的。
对该代码的直接更正可能是:
for (...) {
for (...) {
o <- data %>%
filter(measure == d, condition ==c) %>%
do({ data.frame(outliers = outlier(.$value)) })
print(o)
}
}
其中 o
将是具有三列的 data.frame
(好吧,tbl_df
小标题):measure
、condition
和 outliers
.在这种情况下do
的使用是必需的因为大多数non-tidyverse函数忽略group_by
分组,所以我们使用do
到side-step那个问题。
不过,也许这样可以将两个循环替换为一个命令:
data %>%
group_by(measure, condition) %>%
summarize(outliers = outlier(value)) %>%
ungroup()
我假设您想要的是 measure
和 condition
的每个唯一组合的所有离群值,并且 outlier(.)
函数 returns 是一个向量(某些长度 >= 1)。如果没有发现异常值,则 measure
/condition
对将不包括在内……如果这是一个因素,则使用类似
的东西
data %>%
group_by(measure, condition) %>%
summarize(outliers = list(outlier(value))) %>%
tidyr::unnest(outliers, keep_empty = TRUE) %>%
ungroup()
我的数据中有几个条件和几种测量类型。
我希望 R 分别给出每对条件和测量类型的离群值。
因此,例如,假设我有几个参与者的 3 个条件 (1-3) 和 3 种类型的度量 (A-C),每行都有一个值 x。我想要 condition1&measureA、condition2&measureB 等的值 x 的离群值。
(measure 和 condition 都是非数值的)
我试过创建循环
for(d in unique(data$measure)){
for(c in unique(data$condition)){
data %>%
filter(measure == d, condition ==c) %>%
o <- outlier(data$value) %>%
print(o)
}
}
这个想法是 R 将 运行 通过每个条件并在循环中进行测量,并且每次都挑选出与这些条件匹配的值并计算异常值。 当我 运行 整个代码时,我收到此错误消息
Error in print.default(., o) : invalid printing digits -2147483648
In addition: Warning message:
In print.default(., o) : NAs introduced by coercion to integer range
(如果我 运行 它没有循环,例如通过搜索特定条件的异常值,它也找不到第一行之后的管道函数。)
知道如何正确编码吗?
您已经在使用 dplyr
,所以我建议您使用 group_by
,因为它(对我来说)是一种更自然的数据处理方式。
此外,这部分语法不正确:
data %>%
filter(measure == d, condition ==c) %>%
o <- outlier(data$value) %>%
print(o)
为什么?
filter(...) %>%
应该通过管道传输到 接受帧的东西,但是......你正在从 [=17 发送输出=] 到 assignmento <- outlier(...)
(然后到print(o)
,这实际上意味着print(., o)
其中.
是前一个的输出命令。此外,由于
o
在第一次运行时尚未定义...您应该会收到有关object 'o' not found
的错误消息。你不会在循环中的后续传递中得到它,因为它确实存在......但如果是这样那么它就是循环中 previous 迭代的异常值。当然不是你应该使用的。
对该代码的直接更正可能是:
for (...) {
for (...) {
o <- data %>%
filter(measure == d, condition ==c) %>%
do({ data.frame(outliers = outlier(.$value)) })
print(o)
}
}
其中 o
将是具有三列的 data.frame
(好吧,tbl_df
小标题):measure
、condition
和 outliers
.在这种情况下do
的使用是必需的因为大多数non-tidyverse函数忽略group_by
分组,所以我们使用do
到side-step那个问题。
不过,也许这样可以将两个循环替换为一个命令:
data %>%
group_by(measure, condition) %>%
summarize(outliers = outlier(value)) %>%
ungroup()
我假设您想要的是 measure
和 condition
的每个唯一组合的所有离群值,并且 outlier(.)
函数 returns 是一个向量(某些长度 >= 1)。如果没有发现异常值,则 measure
/condition
对将不包括在内……如果这是一个因素,则使用类似
data %>%
group_by(measure, condition) %>%
summarize(outliers = list(outlier(value))) %>%
tidyr::unnest(outliers, keep_empty = TRUE) %>%
ungroup()