【问题标题】:Conditional data labeling with comparing previous and next rows比较前一行和下一行的条件数据标签
【发布时间】:2019-04-22 04:41:40
【问题描述】:

具有以下类型的数据并希望通过检查 NA 行的 i-1 和 i+1 行来重新标记其 NA 行。

test <- data.frame(sd_value=c(77,18,3,16,32,76),  
                   value=c(5400,6900,7080,1892,4207,4403), 
                   label=c(c("good",NA,"unable"),c("bads",NA,"good")))

> test
  sd_value value  label
1       77  5400   good
2       18  6900   <NA>
3        3  7080 unable
4       16  1892   bads
5       32  4207   <NA>
6       76  4403   good

我要重新标记NA 行的条件是

在简单的图片中:将上一行和下一行的值与NA 行进行比较。如果差异为 NA 行。

如果上一行或下一行是good,则有一个特殊条件。

  1. 如果NA 的 i-1 或 i+1 行与 diff(value)

  2. 如果差异 i+1 标记为 good 并且行 diff(value)eww! 标签。

预期输出

> test
      sd_value value  label
    1       77  5400   good
    2       18  6900 unable
    3        3  7080 unable
    4       16  1892   bads
    5       32  4207   eww!
    6       76  4403   good

检查差异值 i-1 和 i+1

> test%>%
+   mutate(diff_val=c(0,diff(value)), diff_sd_val=c(0,diff(sd_value)))

  sd_value value  label diff_val diff_sd_val
1       77  5400   good        0           0
2       18  6900   <NA>     1500         -59
3        3  7080 unable      180         -15
4       16  1892   bads    -5188          13
5       32  4207   <NA>     2315          16
6       76  4403   good      196          44

【问题讨论】:

  • 如果i-1i+1 的差异出现平局会发生什么?然后会发生什么?
  • @TimBiegeleisen 你这是什么意思?
  • @NelsonGon 他们使用相同的差异标准。请检查 OP 的结尾。
  • 重新标记的条件不清楚,至少对我来说是这样。
  • 我认为 Tim 的意思是如果行 i - 1 i + 1 都满足 value &lt; 200sd_value &lt; 50 条件,那么 label 优先?

标签: r function dplyr diff


【解决方案1】:

免责声明:我使用了我写的manymodelr(为了节省时间)的开发者版本。

library(manymodelr) 
library(dplyr)
res<-rowdiff(test,"reverse")
names(res)<-c("sd_diff","diff_val")

#if difference between i-1 or i+1 row of NA 
#and diff(value) <200 and same as for diff(sd_value) <50 use i-1 or i+1 row's 
#label that meets the condition.
#if difference i+1 is labeled good and row diff(value)<200 and 
#same as for diff(sd_value)<50 use new eww! label.
df_bound<-cbind(test,res)
df_bound %>% 
  mutate(label=ifelse(is.na(label) & lead(label,1)=="good","eww",label),
         label=ifelse(is.na(label) & lead(diff_val,1)<200,lead(label,1),label))

结果:NAs 可以用 0 代替。sd_diff 和 diff_val 可以去掉。

sd_value value  label sd_diff diff_val
1       77  5400   good      NA       NA
2       18  6900 unable     -59     1500
3        3  7080 unable     -15      180
4       16  1892   bads      13    -5188
5       32  4207    eww      16     2315
6       76  4403   good      44      196

【讨论】:

  • 我认为不需要使用manymodelr?。你能添加这个的功能版本吗? custom_label &lt;- function(value,label,sd_value){ 之类的东西并将其应用于dpylr 链?
  • 哦,对了。可以将其链接到dplyr。实际上,该函数使用dplyr"backend",尽管重写该函数并使其适应问题会有点烦人,所以为了节省时间我只是使用rowdiff 来获得各自的差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2020-11-11
  • 2020-12-06
  • 2020-02-22
相关资源
最近更新 更多