在 R 中,如何使用各种条件将数字列变为一个新列?

Posted

技术标签:

【中文标题】在 R 中,如何使用各种条件将数字列变为一个新列?【英文标题】:In R how to mutate a numeric column into one new column using various conditions? 【发布时间】:2021-11-25 13:06:17 【问题描述】:

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

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

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

那些得分为 0 的人 介于 0 和第 33 个百分位之间的那些 介于第 33 和第 66 个百分位之间的人 介于 66% 和 100% 之间的那些

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

希望有人能帮忙!我不知道该怎么做。

谢谢。

【问题讨论】:

如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example。 【参考方案1】:

这是使用cut 的一种方法。创建一个索引idx,它将包含要从百分位数评估中省略的 0 值的行号。下面是一个包含随机数据的简单示例(一个值为零)。

set.seed(42)

df <- data.frame(
  var = sample(0:9, 10)
)

idx <- df$var != 0

df$score_status <- factor(NA_character_, levels = c("none", "low", "middle", "high"))

df$score_status[idx] <- cut(
  df$var[idx],
  breaks = quantile(df$var[idx], probs = c(0, 1/3, 2/3, 1)), 
  include.lowest = TRUE,
  labels = c("low", "middle", "high")
)

df$score_status[!idx] <- "none"

df

输出

   var score_status
1    0         none
2    4       middle
3    9         high
4    7         high
5    1          low
6    3          low
7    5       middle
8    8         high
9    6       middle
10   2          low

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于在 R 中,如何使用各种条件将数字列变为一个新列?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列

r - 使用 group_by 和 mutate 根据多个条件添加新列时出现意外的“=”

如何将列中的所有数据移动到单个列(不合并),然后拆分为R中的新列?

将时间 dd/mm/yyyy 转换为 R 中的数字

在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL

将列表与数据框列进行比较并使用数字创建新列