r - 行中的条件标签
问题描述
我想根据其他行中的条件标记行。
基本上,我要查找的是如果该行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'
value±2*sd_value 之间。如果是这样,请标记它们good
或bad
.
预期输出
> 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
那些基于±2*sd_value
非 NA 行值更改的 NA 行。
解决方案
我们可以对NA
行“值”进行子集化,并使用与“好”“标签”对应的“值”、“sd”进行检查,使用数字索引或使用ifelse
和将逻辑向量(“i2”)更改为“好/坏”根据索引 ('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 的行,arrange
按升序排列并使用它cut
来剪切“值”以获得正确的“标签”
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)
推荐阅读
- excel - Excel公式:根据标题从公式中排除某些列
- r - Psych::Mediate 中的错误:找不到对象
- xcode - 使用 Xcode 开发的 iOS 应用程序嵌入 PowerBI 报告
- ssl - Firefox 可以找到证书,但 curl 不能(通过 ssh 隧道传输 https 时)
- html - HTML div元素中的反转顺序
- sql - 如何限制汇总组合
- r - 按组获取多个时间序列的趋势线斜率
- dns - 使用无服务器框架将 Route 53 中的 DNS 记录添加和更新到 Cloudfront
- python - 从字典python中制作所有可能的句子
- java - 如何解析包含仅需要部分到arraylist的值的字符串?