根据R中的条件添加最大值

时间:2019-09-26 20:30:39

标签: r

紧跟着我的上一个问题,在该问题中给出的示例最终与我所需要的不同。与往常一样,感谢Stack社区的帮助。你们都很棒。

我的数据框如下:

data.frame(COLOR = c("BLUE", "BLUE: RED", "BLUE: GREEN", 
                     "BLUE: RED: GREEN", "RED", "RED: GREEN", 
                     "GREEN"),
           TOTAL = c(1, 2, 1, 1, 2, 1, 3),
           N_CATS = c(0, 1, 1, 4, 3, 1, 0)) %>% 
  arrange(N_CATS)

对于N_CATS介于最小值和最大值之间的任何行(在这种情况下,介于0和4之间),我需要从现有的TOTAL中添加TOTAL最大N_CATS的行。因此,对于N_CATS等于1或3的任何行,我将它们的总数加1,因为这是N_CATS等于4的行的总数。 }}是最大值或最小值,我们保留前一个N_CATS。我想要的输出如下:

TOTAL

有人知道如何使用dplyr解决方案吗?

4 个答案:

答案 0 :(得分:1)

为“ N_CATS”所在的行创建一个逻辑条件,以将“ TOTAL”与值“ TOTAL”相加,其中“ N_CATS”为maxwhich.max-给出索引) '元素不是minmax

library(dplyr)
df1 %>% 
  mutate(NEW_TOTAL = case_when(!N_CATS  %in% range(N_CATS) ~
                        TOTAL  +TOTAL[which.max(N_CATS)], 
       TRUE ~ TOTAL))
#             COLOR TOTAL N_CATS NEW_TOTAL
#1             BLUE     1      0         1
#2            GREEN     3      0         3
#3        BLUE: RED     2      1         3
#4      BLUE: GREEN     1      1         2
#5       RED: GREEN     1      1         2
#6              RED     2      3         3
#7 BLUE: RED: GREEN     1      4         1

数据

df1 <- structure(list(COLOR = structure(c(1L, 5L, 3L, 2L, 7L, 6L, 4L
), .Label = c("BLUE", "BLUE: GREEN", "BLUE: RED", "BLUE: RED: GREEN", 
"GREEN", "RED", "RED: GREEN"), class = "factor"), TOTAL = c(1, 
3, 2, 1, 1, 2, 1), N_CATS = c(0, 0, 1, 1, 1, 3, 4)), row.names = c(NA, 
-7L), class = "data.frame")

答案 1 :(得分:0)

那怎么样:

library(dplyr)
df <- df %>% 
mutate(NEW_TOTAL = if_else(N_CATS == 1 | N_CATS == 3,
                         TOTAL + 1,
                         TOTAL))

答案 2 :(得分:0)

df %>% 
  mutate(NEW_TOTAL = 
           if_else(N_CATS %in% range(N_CATS),
                   TOTAL,
                   TOTAL[which.max(N_CATS)] + TOTAL)
         )

另一种适合您的方法,

答案 3 :(得分:0)

我们可以检查N_CATS是否在range中,这将生成一个逻辑向量,然后将其乘以TOTAL中最大值的N_CATS并添加到原始{ {1}}。

TOTAL

此解决方案也可以轻松更改为基于R的

library(dplyr)
df %>%
  mutate(new_total = TOTAL +(!N_CATS %in% range(N_CATS)) * TOTAL[which.max(N_CATS)])

#             COLOR TOTAL N_CATS new_total
#1             BLUE     1      0         1
#2            GREEN     3      0         3
#3        BLUE: RED     2      1         3
#4      BLUE: GREEN     1      1         2
#5       RED: GREEN     1      1         2
#6              RED     2      3         3
#7 BLUE: RED: GREEN     1      4         1