紧跟着我的上一个问题,在该问题中给出的示例最终与我所需要的不同。与往常一样,感谢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解决方案吗?
答案 0 :(得分:1)
为“ N_CATS”所在的行创建一个逻辑条件,以将“ TOTAL”与值“ TOTAL”相加,其中“ N_CATS”为max
(which.max
-给出索引) '元素不是min
或max
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