首页 > 解决方案 > 在 R 中,如何使用各种条件将数字列变为一个新列?

问题描述

我正在尝试根据原始列的值在数据框中创建一个新列,其中根据值的不同条件将其分为四组。我不知道该怎么做!

假设具有分数(数值 0-1000)的列作为较大数据帧的一部分。

我想根据以下条件创建一个新列分组该分数:

我希望新列类似于“Score_status”,并根据上述条件将它们标记为“无”、“低”、“中”、“高”。需要忽略所有 0 来计算百分位数,因为当拆分为分位数时,Q1 和 Q2 都是 0,因此试图创建这个新列来查看分数 0 之外的数据分布(这是针对 Kaplan-Meier 的)。

我希望有人能帮帮忙!我无法完全理解我将如何做到这一点。

谢谢。

标签: rdplyrsurvival-analysis

解决方案


您可以编写一个将值映射到标签的函数。这允许您计算函数中数据子集的切点。

一个(低效)实现的例子:

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")))

希望即使它根本不优雅,也能做到这一点。


推荐阅读