R - условно выбрать в пределах дубликатов идентификаторов и индекса - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть фрейм данных с дублированными идентификаторами и различными переменными, например:

x <- 1:10
ID <- c(20,20,55,55,45,45,45,45,45,45)
fruit <- c("Orange", "Apple", "Pear", "Apple", "Blueberries", "Apple", "Banana", "Banana", "Strawberry", "Pear")
df <- cbind(x, ID, fruit)

> df
X   ID   fruit
1   20   Orange
2   20   Apple
3   20   Pear
4   55   Apple
5   55   Blueberries
6   45   Apple
7   45   Banana
8   45   Banana
9   45   Strawberry
10  45   Pear

Мне нужно условно индексировать определенные атрибуты в соответствии с иерархией (например, Апельсин> Черника> Груша> Банан> Яблоко>Клубника) в пределах дублированных идентификаторов для приобретения:

X   ID   fruit
1   20   Orange
5   55   Blueberries
10  45   Pear

Действительно, у меня нет хороших / несложных идей о том, как это сделать.Есть мысли?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Если вы хотите, чтобы в каждой группе была только одна строка, и у каждой группы был бы требуемый fruit, мы можем создать отдельный вектор для хранения иерархии и поднастроить его на основе групп, используя mapply.

hierarc_vec <- c("Orange","Blueberries", "Pear", "Banana","Apple","Strawberry")
ids <- unique(df$ID)

df[mapply(function(x, y) which.max(df$ID == x & df$fruit == y), 
                     ids, hierarc_vec[1:length(ids)]), ]


#    x ID       fruit
#1   1 20      Orange
#5   5 55 Blueberries
#10 10 45        Pear

данные

x <- 1:10
ID <- c(20,20,55,55,55,45,45,45,45,45)
fruit <- c("Orange", "Apple", "Pear", "Apple", "Blueberries", 
           "Apple", "Banana", "Banana", "Strawberry", "Pear")
df <- data.frame(x, ID, fruit)
0 голосов
/ 13 декабря 2018

Любите их или ненавидите их, вот для чего были созданы факторы.

library('dplyr')

x <- 1:10
ID <- c(20,20,55,55,45,45,45,45,45,45)
fruit <- c("Orange", "Apple", "Pear", "Apple", "Blueberries", "Apple", "Banana", "Banana", "Strawberry", "Pear")
df <- cbind(x, ID, fruit)

df %>%
    as.data.frame() %>%
    mutate(fruit = factor(
        fruit,
        levels = c('Orange','Blueberries','Pear','Banana','Apple','Strawberry'),
        ordered = T
    )) %>%
    group_by(ID) %>%
    arrange(fruit, ID) %>%
    slice(1)

# A tibble: 3 x 3
# Groups:   ID [3]
  x     ID    fruit      
  <fct> <fct> <ord>      
1 1     20    Orange     
2 5     45    Blueberries
3 3     55    Pear   
0 голосов
/ 13 декабря 2018

Мы arrange 'ID', 'фрукты' на основе levels, указанного в сообщении 'OP, и' X 'в порядке убывания, затем сгруппированы по' ID ', slice первоестрока

library(dplyr)
df %>% 
  arrange(ID, factor(fruit, levels = c('Orange', 'Blueberries', 'Pear', 
             'Banana','Apple', 'Strawberry')), desc(X)) %>% 
  group_by(ID) %>% 
  slice(1)
# A tibble: 3 x 3
# Groups:   ID [3]
#      X    ID fruit      
#  <int> <int> <chr>      
#1     1    20 Orange     
#2    10    45 Pear       
#3     5    55 Blueberries

данные

df <- structure(list(X = 1:10, ID = c(20L, 20L, 20L, 55L, 55L, 45L, 
45L, 45L, 45L, 45L), fruit = c("Orange", "Apple", "Pear", "Apple", 
"Blueberries", "Apple", "Banana", "Banana", "Strawberry", "Pear"
 )), class = "data.frame", row.names = c(NA, -10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...