查找偶数和奇数的最大值和最小值

时间:2017-06-22 05:42:25

标签: r

我在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",  

它不按我想要的方式工作。

2 个答案:

答案 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