【问题标题】:How to filter each column of data in a dataframe by a list of respective outliers如何通过相应异常值的列表过滤数据框中的每一列数据
【发布时间】:2020-10-19 19:21:18
【问题描述】:

我有一个带有各自值的时间戳数据集(这些不是真实的,只是一个示例):

Name time NOx ozone PM25 temp rain wind methane benzene xylene
1    80  40    62    3   32   79   36      53       8     91
2    13  72    40   73    1   77   36      85      66     25
3    87  83    93    2   51   28   96      28      66     37
4     6  53     3   96   42   57   75      77      77     50
5    38  61    85   36    2    4   43      17      20     59
6    54  15    75   72   81  100   72      62      86     40
7    36   5    70   44   99    1   62      49      48     66
8    73  97     7   87    7    4   59      97      49     36
9    30  89    58   28   91   72   94      85      68     25
10   12  51    78   17   82   67   52      13      67     60

我有一个单独的表格,其中包含我使用“汇总”执行的一些统计信息,包括每个参数的异常值阈值(除“名称”和“时间”之外的所有列):

 NOx ozone PM25 temp rain wind methane benzene xylene
53    73   67   26   59   52      45      70     75

我想创建一个新表,其中显示名称、时间、参数和值,其中任何特定值都大于其异常值阈值。我通过使用 pivot_longer 将这两个数据框都设为“更长”格式来尝试此操作,现在我的主数据框如下所示:

Name time parameter value
 1    80 NOx          40
 2    80 ozone        62
 3    80 PM25          3
 4    80 temp         32
 5    80 rain         79
 6    80 wind         36
 7    80 methane      53

我的异常数据框如下所示:

 parameter value
 NOx          53
 ozone        73
 PM25         67
 temp         26
 rain         59
 wind         52
 methane      45
 benzene      70
 xylene       75

我希望我的新异常值表看起来像上面的“更长”数据框,每个参数和值都有各自的“名称”和“时间”。我尝试使用“过滤器”进行此操作:

new_a <- A_long %>%
   group_by(parameter) %>%
   filter(A_long$value > B_long$value)
Error: Result must have length 50, not 450

我在尝试此操作时确实收到了一条错误消息,但我也不认为我尝试的此代码会给我想要的表格。有什么建议吗?

【问题讨论】:

  • 您遇到的具体错误是什么,您能否展示您编写的产生错误的过滤器代码?
  • 当然,我会将其添加到原始问题中。我非常希望我的异常值数据框看起来像具有 4 列(名称、时间、参数、值)的原始数据框,但只有每个参数被视为异常值的值。

标签: r filter dplyr outliers


【解决方案1】:

假设您的原始数据框名为df,而您的异常值存储在df_outl

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols=-c("Name", "time"), names_to="parameter") %>%
  left_join(df_outl, by="parameter") %>%
  filter(value.x >= value.y) %>%
  select(Name, time, parameter, value:=value.x, -value.y)

返回

# A tibble: 43 x 4
    Name  time parameter value
   <dbl> <dbl> <chr>     <dbl>
 1     1    80 temp         32
 2     1    80 rain         79
 3     1    80 methane      53
 4     1    80 xylene       91
 5     2    13 NOx          72
 6     2    13 PM25         73
 7     2    13 rain         77
 8     2    13 methane      85
 9     3    87 NOx          83
10     3    87 ozone        93

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多