如何制作具有动态条件的 Case_when 将连续向量修改为 R 中数字的序数向量?

问题描述 投票:0回答:1

我正在构建一个数据集,其中有一个从 0 到 1 的连续变量,我想将其转换为具有 N 个“级别”的序数变量。例如,我有很多0到0.2之间的连续数字,需要全部转换为0.1,然后将0.2到0.4的连续数字转换为0.2等等。

这一点的部分重要性在于更改级别数量的动态能力,因为我的演示旨在展示具有可以动态修改的更多或更少级别的效果。

为了实现这一目标,我根据我的计划在 for 循环中编写了以下动态代码。我收到错误,第二个条件无法评估,其余条件返回默认值。

下面是动态代码:

binN3 <- pretty (x$x, n = 40)
x$y <- seq(0,1, length.out = 100)
x <- as.data.frame(x)

for(i in 1:length(binN3)) {
  print(paste(i))
  print(paste(binN3[i]))
  
  x <- x %>%
  mutate(ordinal = case_when(
    y <= binN3[1] ~ 0,
    y <= binN3[i+1] ~ print(binN3[i]),
    .default = 999
  ))
}

以下是硬代码:

x <- x %>%
  mutate(linresp = case_when(
    x <= 0.02 ~ 0,
    x <= 0.04 ~ 0.02,
    x <= 0.06 ~ 0.04,
    .default ~ 999
  ))

动态代码的结果如下所示:

0, 999, 999, 999....

我非常有信心我的错误就在这行代码中,尽管我不确定如何更改语法。

y <= binN3[i+1] ~ print(binN3[i])

我想要复制的硬代码的结果: 0、0、0、0、0.02、0.02、0.04、0.04。等等...

任何修复此错误的帮助将不胜感激!

r for-loop dynamic case
1个回答
0
投票

您的代码的问题在于,mutate 将在循环的每次迭代中评估数据帧的每一行,因此每一行最终都会与 binN3 的最后一个值进行比较。

您的代码中没有数据框的声明,因此如果这对您不起作用,请告诉我,但我找到了一个可以满足您需求的函数:

x$ordinal <- cut(x$y, breaks = length(binN3), labels = binN3)
© www.soinside.com 2019 - 2024. All rights reserved.