我的数据中有几种条件和几种类型的测量。
我想让R分别给出每对条件和测量类型的离群值。
例如,假设我对几个参与者有3个条件(1-3)和3种度量类型( and ),每一行都有一个值x。我想要条件1和测度A,条件2和测度B等的值x的异常值。
(测度和条件都是非数值的)
我试过创建一个循环
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(如果我在没有循环的情况下运行它,例如通过搜索特定条件的异常值,它也无法在第一行之后找到管道函数。)
知道该如何正确编码吗?
发布于 2020-09-26 21:25:47
您已经在使用dplyr,所以我建议您使用group_by,因为它(对我来说)是处理数据的一种更自然的方法。
此外,此部分语法不正确:
data %>%
filter(measure == d, condition ==c) %>%
o <- outlier(data$value) %>%
print(o)为什么?
filter(...) %>%应该连接到能接受帧的东西,但是.您正在将来自filter的输出发送到赋值o <- outlier(...) (然后发送到print(o),这实际上意味着print(., o),其中.是前一个命令的输出。)
o还没有定义.您应该得到一个关于object 'o' not found的错误。在循环中的后续传递中不会得到它,因为它确实存在.但如果是这样的话,则是循环中上一次迭代中的异常值。当然不是你应该使用的东西。对该守则的直接更正可能是:
for (...) {
for (...) {
o <- data %>%
filter(measure == d, condition ==c) %>%
do({ data.frame(outliers = outlier(.$value)) })
print(o)
}
}其中,o将是一个有三列的data.frame (好吧,tbl_df tibble):measure、condition和outliers。在这种情况下,需要使用do,因为大多数非tidyverse函数忽略了group_by分组,因此我们使用do来解决这个问题。
不过,也许是为了将这两个循环替换为一个命令:
data %>%
group_by(measure, condition) %>%
summarize(outliers = outlier(value)) %>%
ungroup()我假设您想要的是measure和condition的每个唯一组合的所有异常值,并且outlier(.)函数返回一个向量(长度为>= 1)。如果未发现异常值,则不包括measure/condition对.如果这是一个因素,那么使用类似的
data %>%
group_by(measure, condition) %>%
summarize(outliers = list(outlier(value))) %>%
tidyr::unnest(outliers, keep_empty = TRUE) %>%
ungroup()https://stackoverflow.com/questions/64082565
复制相似问题