r - 行中的条件标记

标签 r algorithm dplyr

我想根据其他行中的条件来标记行。

基本上,我要查找的是如果该行是 NA,则查找非 NA 的行并使用其 sd_value 列来决定是否标记 NA 行及其标签,否则将其标记为 NA。我希望这个解释很简单。

所以可以说我们有

df <- data.frame(value = c(0.5,1,0.6,1.2), sd_value=c(0.1,0.5,0.2,0.8),
             label = c("good", "bad",NA,NA))


> df
  value sd_value label
1   0.5      0.1  good
2   1.0      0.1   bad
3   0.6      0.5    NA
4   1.2      0.8    NA

要标记例如第 3 行,我需要检查该行值,然后检查它们是否位于 'good''bad' 值之间± 2*sd_值。如果是这样,请将它们标记为

预期输出

> df
  value sd_value label
1   0.5      0.1  good
2   1.0      0.1   bad
3   0.6      0.5  good   #because 0.6 is ±2*sd_value of 1st row value 
4   1.2      0.8   bad   #because 1.2 is ±2*sd_value of 2nd row value

为了更概括这个问题,我们可以说我们有这样的数据

df <- data.frame(value = c(0.5, 1,8, 1.2, 2.4,0.4,6,2,5.7, 9),   
                 sd_value=c(0.1, 0.1,1, 0.2,0.2,0.1,0.4,0.2,0.1,0.1),
                 label = c("good",NA,"beautiful","bad", NA,NA,"ugly","dirty",NA,NA))


> df
   value sd_value     label
1    0.5      0.1      good
2    1.0      0.1      <NA>
3    8.0      1.0 beautiful
4    1.2      0.2       bad
5    2.4      0.2      <NA>
6    0.4      0.1      <NA>
7    6.0      0.4      ugly
8    2.0      0.2     dirty
9    5.7      0.1      <NA>
10   9.0      0.1      <NA>

根据条件,预期输出应如下所示

> df
   value sd_value     label
1    0.5      0.1      good #original label
2    1.0      0.1      bad
3    8.0      1.0      beautiful #original label
4    1.2      0.2      bad
5    2.4      0.2      dirty
6    0.4      0.1      good
7    6.0      0.4      ugly #original label
8    2.0      0.2      dirty #original label
9    5.7      0.1      ugly 
10   9.0      0.1      beautiful 

那些基于非 NA 行值的 ±2*sd_value 更改的 NA 行。

最佳答案

我们可以对 NA 行“value”进行子集化,并使用与“good”标签对应的“value”、“sd”进行检查,将逻辑向量 (“i2”) 更改为“好/坏”,使用数字索引或使用 ifelse 并根据索引 ('i1') 将输出分配回列

i1 <- is.na(df$label)
i2 <- df$value[i1] < abs(df$value[1] + 2 * df$sd_value[1])
df$label[i1] <- c("bad", "good")[(i2 + 1)]

可以将其包装在函数中

f1 <- function(data, lblCol, valCol, sdCol){
     i1 <- is.na(df[[lblCol]])
     gd <- which(df[[lblCol]] == "good")
     i2 <- df[[valCol]][i1] < abs(df[[valCol]][gd] + 2 * df[[sdCol]][gd])
     df[[lblCol]][i1] <- c("bad", "good")[(i2 + 1)]
     df
  }

f1(df, "label", "value", "sd_value")
#  value sd_value label
#1   0.5      0.1  good
#2   1.0      0.5   bad
#3   0.6      0.2  good
#4   1.2      0.8   bad

更新

使用更新后的数据集,我们提取“标签”非 NA 的行,按升序排列它,并在cut中使用它来剪切“value' 以获得正确的'标签'

library(dplyr) 
df1 <- df %>% 
      filter(!is.na(label)) %>% 
      transmute(label, v1 = value + 2 * sd_value) %>%
      arrange(v1)
df %>% 
    mutate(label = cut(value, breaks = c(-Inf, df1$v1), labels = df1$label)) 
#   value sd_value     label
#1    0.5      0.1      good
#2    1.0      0.1       bad
#3    8.0      1.0 beautiful
#4    1.2      0.2       bad
#5    2.4      0.2     dirty
#6    0.4      0.1      good
#7    6.0      0.4      ugly
#8    2.0      0.2     dirty
#9    5.7      0.1      ugly
#10   9.0      0.1 beautiful

或者base R中的相同逻辑

df1 <- transform(na.omit(df), v1 = value + 2 * sd_value)[3:4]
df$label <- cut(df$value,  breaks = c(-Inf, df1$v1), labels = df1$label)

关于r - 行中的条件标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55756113/

相关文章:

r - 在 dplyr 中使用 approx

r - 如何在 R 中构建一次汇总多个值的表

r - 在不使用包的情况下编写直方图

r - 编织者忽略了fig.pos?

r - 将 alpha 值添加到 lattice xyplot 面板函数

arrays - 算法逻辑,拆分数组

algorithm - 检测与其余数据非常分散的点

r - 在 ggplot 对象之外存储绘图工具提示信息

algorithm - 检查二叉树是镜像还是对称

r - 在函数中使用可变数量的组