如何根据另一列中值的单一出现使一列中的所有值相同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据另一列中值的单一出现使一列中的所有值相同?相关的知识,希望对你有一定的参考价值。
因此,我有一个数据框,其中每个物种都具有从A-E得出的物种名称和等级,有时会出现相同物种的不同等级,但是我想要以下内容:如果一个物种甚至有一个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 |
答案
[这是我将使用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
以上是关于如何根据另一列中值的单一出现使一列中的所有值相同?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - 如何根据另一列中的唯一值转置一列中的单元格?
Pyspark:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值