我是这样的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"))
任何帮助将不胜感激。
3条答案
按热度按时间u2nhd7ah1#
您的设置有一些问题,例如,当b 9等于3或8时,您想要的内容将不会留下标签:
如果b 9 <= 2,则写为黄色。如果b 9在4和7之间,则写为白色。如果b 9>= 9,则写为绿色
我将把“白色”条件改为3到7之间的标签b 9,把“绿色”改为>= 8,以保持正常。那么这个应该行得通:
输出:
如果你从最窄的条件开始,
case_when
工作得最好,然后随着你沿着条件列表向下移动,它会在找到与你的变量匹配的条件时执行赋值操作,所以你不必担心,例如,b9=12
会匹配前两个条件-case_when
甚至不会超过第一个条件。然后你甚至不需要定义你最许可的条件,只需要使用TRUE
,这基本上意味着,如果你已经走到这一步,这是你剩下的赋值。你的代码是向后的,所以例如
b9=12
被赋值为“白色”,因为它满足第二个条件b9 >= greater_threshold1 | b9 <= greater_threshold2 ~ "white"
,并且赋值函数永远不会到达您真正想要的b9 >= greater_threshold3 ~ "green"
。虽然你也可以得到你想要的,我认为,如果你把第二个条件中的OR运算符改为AND,即。如果您使用我所描述的从窄到宽的条件方法,那么您就不需要处理&
,而且您可以得到更简洁的代码。rvpgvaaj2#
我们可以使用
cut()
来实现:b09cbbtk3#
您可以从
dplyr
使用between
:输出:
不符合条件(即8)的为
NA