2017-06-22 7 views
2

Ich habe folgende Datenrahmen in rFinden max und min für gerade und ungerade Zahlen

ID  numbers 
1  12 
2  4 
3  13 
4  8 
5  9 
6  4 

Ich größte finden wollen und kleinste ungerade und gerade Zahl in der Spalte und markieren es

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 

Ich habe versucht, dabei

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

Es funktioniert nicht so, wie ich wollte.

+0

Was passiert, wenn es nur 1 gerade Zahl ist? – zx8754

+0

In meinem Fall wird es nicht passieren. Ich werde mindestens zwei gerade oder ungerade Zahlen haben. – Neil

Antwort

2

Mit dplyr, machen Sie eine Gruppe von Odds/Evens und erhalten Sie dann min max pro Gruppe.

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 

EDIT:

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 
+0

Ist es möglich, gerade oder ungerade Zahl zu drucken, wo es leer ist? wie in der 4. Reihe sollte es 'even' – Neil

+0

@ zx8754 drucken Ich ersetzte es mit' grp' aber es gibt mir 'OddLargest ungerade, evenLargest sogar ' so etwas wie – Neil

+0

@Neil aktualisiert, um ungerade/gerade zeigen, wenn sie nicht am größten sind oder am kleinsten. – zx8754

1

Hier ist eine Option mit 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 
+1

Danke @akrun. Geschätzt – Neil

Verwandte Themen