比较前一行和下一行的条件数据标签
Conditional data labeling with comparing previous and next rows
具有以下类型的数据并希望通过检查 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
行进行比较。如果差异小于 200,则使用该行的标签作为 NA
行。
如果上一行或下一行是 good
,则有一个特殊条件。
如果 NA
的 i-1 或 i+1 行和 diff(value) <200 之间的差异与 diff(sd_value) <50 相同,则使用 i -1或i+1行符合条件的标签
如果差异 i+1 被标记为 good
且行 diff(value)<200 并且与 diff(sd_value)<50 相同
使用新的 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
免责声明:我已经使用了我写的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))
结果:NA可以用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
具有以下类型的数据并希望通过检查 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
行进行比较。如果差异小于 200,则使用该行的标签作为 NA
行。
如果上一行或下一行是 good
,则有一个特殊条件。
如果
NA
的 i-1 或 i+1 行和 diff(value) <200 之间的差异与 diff(sd_value) <50 相同,则使用 i -1或i+1行符合条件的标签如果差异 i+1 被标记为
good
且行 diff(value)<200 并且与 diff(sd_value)<50 相同 使用新的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
免责声明:我已经使用了我写的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))
结果:NA可以用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