我在r
中有以下数据框 ID numbers
1 12
2 4
3 13
4 8
5 9
6 4
我想在列中找到最大和最小的奇数和偶数并标记它
ID numbers Tag
1 12 Largest even
2 4 Smallest even
3 13 Largest odd
4 8
5 9 Smallest odd
6 4 Smallest even
我尝试过以下
df$tag <- ifelse(which.max(df$numbers %% 2 == 0),"Largest even",
ifelse(which.min(df$numbers %% 2 == 0),"Smallest even",
ifelse(which.max(df$numbers %% 2 != 0),"Largest odd",
ifelse(which.min(df$numbers %% 2 != 0),"Smallest odd",
它不按我想要的方式工作。
答案 0 :(得分:2)
使用dplyr,制作一组赔率/平均值,然后每组得到最大值。
library(dplyr)
df1 %>%
mutate(grp = if_else(numbers %% 2 == 0, "even", "odd")) %>%
group_by(grp) %>%
mutate(ID, numbers,
Tag = paste0(if_else(numbers == min(numbers), paste("Smallest", grp), ""),
if_else(numbers == max(numbers), paste("Largest", grp), ""))) %>%
ungroup() %>%
select(-grp)
# # A tibble: 6 x 3
# ID numbers Tag
# <int> <int> <chr>
# 1 1 12 Largest even
# 2 2 4 Smallest even
# 3 3 13 Largest odd
# 4 4 8
# 5 5 9 Smallest odd
# 6 6 4 Smallest even
修改强>
df1 %>%
mutate(grp = if_else(numbers %% 2 == 0, "even", "odd")) %>%
group_by(grp) %>%
mutate(ID, numbers,
Tag = paste0(if_else(numbers == min(numbers), "Smallest ", ""),
if_else(numbers == max(numbers), "Largest ", ""),
grp)) %>%
ungroup() %>%
select(-grp)
# # A tibble: 6 x 3
# ID numbers Tag
# <int> <int> <chr>
# 1 1 12 Largest even
# 2 2 4 Smallest even
# 3 3 13 Largest odd
# 4 4 8 even
# 5 5 9 Smallest odd
# 6 6 4 Smallest even
答案 1 :(得分:1)
以下是使用data.table
library(data.table)
setDT(df1)[, Tag := paste(c("", "Smallest", "Largest")[1 + (numbers == min(numbers)) +
2*(numbers == max(numbers))], grp), .(grp = c('even', 'odd')[(numbers%%2)+1])]
df1
# ID numbers Tag
#1: 1 12 Largest even
#2: 2 4 Smallest even
#3: 3 13 Largest odd
#4: 4 8 even
#5: 5 9 Smallest odd
#6: 6 4 Smallest even