R语言 如何对福尔斯某个数字范围的变量进行分组

de90aj5v  于 2023-06-03  发布在  其他
关注(0)|答案(3)|浏览(200)

我是这样的df

my_df <- data.frame(
    b1 = c(2, 6, 3, 6, 4, 2, 1, 9, NA), 
    b2 = c(100, 4, 106, 102, 6, 6, 1, 1, 7), 
    b3 = c(75, 79, 8, 0, 2, 3, 9, 5, 80), 
    b4 = c(NA, 6, NA, 10, 12, 8, 3, 6, 2),
    b5 = c(2, 12, 1, 7, 8, 5, 5, 6, NA),
    b6 = c(9, 2, 4, 6, 7, 6, 6, 7, 9),
    b7 = c(1, 3, 7, 7, 4, 2, 2, 9, 5),
    b8 = c(NA, 8, 4, 5, 1, 4, 1, 3, 6),
    b9 = c(4, 5, 7, 9, 5, 1, 1, 2, 12))

我想基于以下假设创建一个新列(NEW)。
如果b 9 <= 2,则写为黄色。如果b 9在4和7之间,则写为白色。如果b 9>= 9,则写为绿色
我们的想法是创造这样的东西。

my_df1 <- data.frame(
        b1 = c(2, 6, 3, 6, 4, 2, 1, 9, NA), 
        b2 = c(100, 4, 106, 102, 6, 6, 1, 1, 7), 
        b3 = c(75, 79, 8, 0, 2, 3, 9, 5, 80), 
        b4 = c(NA, 6, NA, 10, 12, 8, 3, 6, 2),
        b5 = c(2, 12, 1, 7, 8, 5, 5, 6, NA),
        b6 = c(9, 2, 4, 6, 7, 6, 6, 7, 9),
        b7 = c(1, 3, 7, 7, 4, 2, 2, 9, 5),
        b8 = c(NA, 8, 4, 5, 1, 4, 1, 3, 6),
        b9 = c(4, 5, 7, 9, 5, 1, 1, 2, 12),
        NEW = c("white", "white", "white", "green", "white", "yellow", "yellow", "yellow", "green"))

我以为这样就行了,但没有。

greater_threshold <- 2
greater_threshold1 <- 4
greater_threshold2 <- 7
greater_threshold3 <- 9

my_df1 <- my_df %>%
    mutate(NEW = case_when(b9 <= greater_threshold ~ "yellow", b9 >= greater_threshold1 | b9 <= greater_threshold2 ~ "white", b9 >= greater_threshold3 ~ "green"))

任何帮助将不胜感激。

u2nhd7ah

u2nhd7ah1#

您的设置有一些问题,例如,当b 9等于3或8时,您想要的内容将不会留下标签:
如果b 9 <= 2,则写为黄色。如果b 9在4和7之间,则写为白色。如果b 9>= 9,则写为绿色
我将把“白色”条件改为3到7之间的标签b 9,把“绿色”改为>= 8,以保持正常。那么这个应该行得通:

greater_threshold1 <- 2
greater_threshold2 <- 7

my_df <- mutate(my_df,
                NEW = case_when(
                  b9 > greater_threshold2 ~ 'green',
                  b9 > greater_threshold1 ~ 'white',
                  TRUE ~ 'yellow'
                )) %>% print()

输出:

b1  b2 b3 b4 b5 b6 b7 b8 b9    NEW
1  2 100 75 NA  2  9  1 NA  4  white
2  6   4 79  6 12  2  3  8  5  white
3  3 106  8 NA  1  4  7  4  7  white
4  6 102  0 10  7  6  7  5  9  green
5  4   6  2 12  8  7  4  1  5  white
6  2   6  3  8  5  6  2  4  1 yellow
7  1   1  9  3  5  6  2  1  1 yellow
8  9   1  5  6  6  7  9  3  2 yellow
9 NA   7 80  2 NA  9  5  6 12  green

如果你从最窄的条件开始,case_when工作得最好,然后随着你沿着条件列表向下移动,它会在找到与你的变量匹配的条件时执行赋值操作,所以你不必担心,例如,b9=12会匹配前两个条件-case_when甚至不会超过第一个条件。然后你甚至不需要定义你最许可的条件,只需要使用TRUE,这基本上意味着,如果你已经走到这一步,这是你剩下的赋值。
你的代码是向后的,所以例如b9=12被赋值为“白色”,因为它满足第二个条件b9 >= greater_threshold1 | b9 <= greater_threshold2 ~ "white",并且赋值函数永远不会到达您真正想要的b9 >= greater_threshold3 ~ "green"。虽然你也可以得到你想要的,我认为,如果你把第二个条件中的OR运算符改为AND,即。如果您使用我所描述的从窄到宽的条件方法,那么您就不需要处理&,而且您可以得到更简洁的代码。

rvpgvaaj

rvpgvaaj2#

我们可以使用cut()来实现:

library(dplyr)

my_df %>%
  mutate(NEW = cut(b9, 
                   breaks = c(-Inf, 2, 4, 7, Inf),
                   labels = c("yellow", "white", "white", "green"),
                   include.lowest = TRUE))

  b1  b2 b3 b4 b5 b6 b7 b8 b9    NEW
1  2 100 75 NA  2  9  1 NA  4  white
2  6   4 79  6 12  2  3  8  5  white
3  3 106  8 NA  1  4  7  4  7  white
4  6 102  0 10  7  6  7  5  9  green
5  4   6  2 12  8  7  4  1  5  white
6  2   6  3  8  5  6  2  4  1 yellow
7  1   1  9  3  5  6  2  1  1 yellow
8  9   1  5  6  6  7  9  3  2 yellow
9 NA   7 80  2 NA  9  5  6 12  green
b09cbbtk

b09cbbtk3#

您可以从dplyr使用between

my_df %>%
  mutate(NEW = case_when(
    b9 <= 2 ~ "Yellow",
    between(b9, 4, 7) ~ "white",
    b9 >= 9 ~ "green"
  ))

输出:

b1  b2 b3 b4 b5 b6 b7 b8 b9    NEW
1  2 100 75 NA  2  9  1 NA  4  white
2  6   4 79  6 12  2  3  8  5  white
3  3 106  8 NA  1  4  7  4  7  white
4  6 102  0 10  7  6  7  5  9  green
5  4   6  2 12  8  7  4  1  5  white
6  2   6  3  8  5  6  2  4  1 Yellow
7  1   1  9  3  5  6  2  1  1 Yellow
8  9   1  5  6  6  7  9  3  2 Yellow
9 NA   7 80  2 NA  9  5  6 12  green

不符合条件(即8)的为NA

相关问题