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
计算e
和a
的顺序当然很关键:如果你先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))
我想在满足条件时替换小标题中的值。
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
计算e
和a
的顺序当然很关键:如果你先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))