Как сделать все значения одинаковыми в столбце, в соответствии с единственным появлением значения из другого столбца? - PullRequest
0 голосов
/ 04 марта 2020

Итак, у меня есть фрейм данных с названиями видов и сортами AE, приписанными каждому, и иногда встречаются случаи одного и того же вида с разными сортами, но я хочу следующее: если у вида есть хотя бы один случай с классом X, то все другие экземпляры этого вида также должны быть класса X. Это мой фрейм данных:

     species        |    grade      | 
-----------------------------------
Tilapia guineensis  | B |
Tilapia guineensis  | E |
Tilapia zillii      | A |
Fundulus rubrifrons | A |
Eutrigla gurnardus  | D |
Sprattus sprattus   | A |
Gadus morhua        | E |
Gadus morhua        | B |
Tilapia zillii      | C |
Gadus morhua        | B | 
Eutrigla gurnardus  | C |

До сих пор я попробовал следующее для класса E в качестве примера:

 df<-df%>% left_join(df%>% 
                                   group_by(species) %>% 
                                   summarize(sum_e = sum(grade=='E')),by='species') %>%
    mutate(grade = ifelse(sum_e>0,"E",grade))

Но я получаю ошибку:

Error: `by` can't contain join column `species` which is missing from RHS

Вывод, который я хочу получить, в основном такой:

     species        |    grade      | 
-----------------------------------
Tilapia guineensis  | E |
Tilapia guineensis  | E |
Tilapia zillii      | C |
Fundulus rubrifrons | A |
Eutrigla gurnardus  | D |
Sprattus sprattus   | A |
Gadus morhua        | E |
Gadus morhua        | E |
Tilapia zillii      | C |
Gadus morhua        | B | 
Eutrigla gurnardus  | D |

1 Ответ

1 голос
/ 04 марта 2020

Вот как я бы подошел к этому, используя пакет data.table. Я думаю, что если изменить на dplyr, этапы будут похожи, просто написано по-другому

# solution using data.table package
library(data.table)

# fake data, replace with yours
df <- data.frame(species=c("a", "a", "b", "b"),
                 grade=c("A", "E", "B", "C"))

# select your grade
dominant_grade <- "E"
# convert to data.table
dt <- as.data.table(df)
# search over species, add a column that checks if any of the grades is equal
# to the dominant one
dt[, contains_dominant := any(grade == dominant_grade), by=species]
# For cases where the dominant one is present, set all the grades to the dominant
# one
dt[contains_dominant == TRUE, grade := dominant_grade]

# convert back to data frame and trim for output
out <- setDF(dt[, .(species, grade)])
out
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...