【问题标题】:How to filter out rows where the value is very different from the other values?如何过滤掉值与其他值非常不同的行?
【发布时间】:2018-07-02 07:56:38
【问题描述】:

我想删除特定变量 HEIGHT_CM 的值与同一 ID PATIENT_ID 的其他值非常不同的行。

  • 与其他值的差异 >2

数据:

df <- read.table(text = "PATIENT_ID MEASUREMENT_TAKEN_DATE  HEIGHT_CM
1   20140305    163
1   20140409    163
1   20140528    164
1   20140730    164
1   20141210    99.7
2   20140305    155
2   20140527    157
2   20141111    78
3   20140721    90
4   20140528    168
4   20140627    167
4   20140917    167
4   20141002    70", header = TRUE, stringsAsFactors = FALSE)

期望的输出

df <- read.table(text = "PATIENT_ID MEASUREMENT_TAKEN_DATE  HEIGHT_CM
1   20140305    163
1   20140409    163
1   20140528    164
1   20140730    164
2   20140305    155
2   20140527    157
3   20140721    90
4   20140528    168
4   20140627    167
4   20140917    167", header = TRUE, stringsAsFactors = FALSE)

【问题讨论】:

  • 定义非常不同。我们还可以查看您的尝试以及您遇到的问题吗?
  • 尝试使用quantile()
  • @Sotos 与其他值的差异 >2
  • 同一个 id 的平均值相差 > 2?
  • “>2 与其他值的差异” 连续条目之间的差异?与均值的区别?中位数?请明确点!还请显示您的代码尝试!

标签: r dplyr data-manipulation tidyr purrr


【解决方案1】:
library(dplyr)
df <- df %>% 
  group_by(PATIENT_ID) %>% 
  mutate(difference = abs(mean(HEIGHT_CM, na.rm = T) - HEIGHT_CM)) %>% 
  filter(difference <= 50)

您在这里过滤difference &gt;= 50,其中difference 介于组的平均值和单个值之间。这将获得您向我们展示的输出。

【讨论】:

    【解决方案2】:

    一种去除异常值的统计方法,可以得出准确的结果:

    library(dplyr)
    df1 <- df %>% group_by(PATIENT_ID) %>% summarize(s=sd(HEIGHT_CM),m=mean(HEIGHT_CM))
    df %>% inner_join(df1,by="PATIENT_ID") %>% 
      filter(is.na(s)|((HEIGHT_CM>m-s)&(HEIGHT_CM<m+s))) %>% select(-c(4,5))
    

    【讨论】:

    • 感谢您的回答。这是哪种去除异常值的方法?
    • @HNSKD 这是一个简单的经典方法。查看en.wikipedia.org/wiki/Outlier 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多