r - 在 R 中,如何使用各种条件将数字列变为一个新列?
问题描述
我正在尝试根据原始列的值在数据框中创建一个新列,其中根据值的不同条件将其分为四组。我不知道该怎么做!
假设具有分数(数值 0-1000)的列作为较大数据帧的一部分。
我想根据以下条件创建一个新列分组该分数:
- 那些得分为 0 的人
- 介于 0 和第 33 个百分位之间的那些
- 介于第 33 和第 66 个百分位之间的人
- 介于 66% 和 100% 之间的人
我希望新列类似于“Score_status”,并根据上述条件将它们标记为“无”、“低”、“中”、“高”。需要忽略所有 0 来计算百分位数,因为当拆分为分位数时,Q1 和 Q2 都是 0,因此试图创建这个新列来查看分数 0 之外的数据分布(这是针对 Kaplan-Meier 的)。
我希望有人能帮帮忙!我无法完全理解我将如何做到这一点。
谢谢。
解决方案
您可以编写一个将值映射到标签的函数。这允许您计算函数中数据子集的切点。
一个(低效)实现的例子:
cut_with_none <- function(x, none_value, none_label, quant, break_labels) {
y <- x == none_value
q_val <- quantile(x[!y], quant)
res <- vector(mode = "character", length = length(x))
for(i in rev(seq_along(q_val))) {
res[x <= q_val[i]] <- break_labels[i]
}
res[y] <- none_label
res
}
在哪里:
- none_value:您要标记为无的值
- none_label:无值的标签
- quant:一个介于 0 和 1 之间的数字向量传递给 quantile 以计算中断值
- break_labels:名称向量与标签的量化向量一样长。
您可以使用 mutate 轻松地使用该函数添加列。
例如随机数据:
tibble(subject = sample(letters[1:3], 10, replace = TRUE),
value = rgeom(10, 0.5)) %>%
mutate(label_value = cut_with_none(value, 0, "none",
quant = c(1/3, 2/3, 1),
break_labels = c("low", "middle", "high")))
希望即使它根本不优雅,也能做到这一点。