R - 有条件的替换

R - Conditional Replacements

我想在满足条件时替换小标题中的值。

Data <- tibble(a = 1:5,
b = c("a","b","a","a","a"), 
c = c("z","y","x","z","z"), 
d = c("m","n","m","m","m"),
e = c(1,3,4,7,2))

  a b c d e
1 1 a z m 1
2 2 b y n 3
3 3 a x m 4
4 4 a z m 7
5 5 a z m 2

我想根据 a 列中的最大值替换包含 b、c 和 d 列重复组合的行。这里第 1、4 和 5 行在 b、c 和 d 列中都包含“a”、“z”和“m”,因此此示例将输出如下:

  a b c d e
1 5 a z m 2
2 2 b y n 3
3 3 a x m 4
4 5 a z m 2
5 5 a z m 2

这里有一个想法,针对修改后的要求进行了更新,即e从最大a行更新为e的值。

整洁宇宙

library(dplyr)
Data %>%
  group_by(b,c,d) %>%
  mutate(e = e[which.max(a)], a = max(a)) %>% 
  ungroup()
# # A tibble: 5 x 5
#       a b     c     d         e
#   <int> <chr> <chr> <chr> <dbl>
# 1     5 a     z     m         2
# 2     2 b     y     n         3
# 3     3 a     x     m         4
# 4     5 a     z     m         2
# 5     5 a     z     m         2

计算ea的顺序当然很关键:如果你先max(a),那么e就不知道哪个原始 a 的值是最大值

data.table

library(data.table)
cols <- c("a", "e")
as.data.table(Data)[, c("e", "a") := .(e[which.max(a)], max(a)), by = .(b, c, d)][]
#    a b c d e
# 1: 5 a z m 2
# 2: 2 b y n 3
# 3: 3 a x m 4
# 4: 5 a z m 2
# 5: 5 a z m 2

(尾部的[]只是data.table中的一个小feature/bug ...只是为了美观需要,没有它数据是一样的。)

base R中,我们可以使用ave

Data$a <- with(Data, ave(a, b, c, d, FUN = max))
Data$e <- with(Data, ave(e, b, c, d, FUN = max))