在 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中的新列?