如何使用ifelse函数基于数据框中另一列的条件来更改列中某些行的值?

时间:2019-06-19 20:59:00

标签: r

因此,我有第一个数据框(fish18),其中包含鱼标本的数据,以及一个用“ ifelse”函数中的条件填充的“等级”列。

species          BIN                                  collectors                          country grade species_frequency
1   Poecilothrissa congica BOLD:AAF7519                                 mljs et al, Democratic Republic of the Congo    NA                 2
2    Acanthurus triostegus BOLD:AAA9362 Vinothkumar S, Kaleshkumar K and Rajaram R.                            India    NA                54
3 Pseudogramma polyacantha BOLD:AAC5137                            Allan D. Connell                     South Africa    NA                15
4   Pomadasys commersonnii BOLD:AAD1338                            Allan D. Connell                     South Africa    NA                12
5       Secutor insidiator BOLD:AAB2487                            Allan D. Connell                     South Africa    NA                18
6      Sebastes macdonaldi BOLD:AAJ7419                                Merit McCrea                    United States    NA                 3
  BIN_per_species collector_per_species countries_per_species species_per_bin
1               2                     1                     1               1
2               1                    21                    15               1
3               3                     6                     6               1
4               1                     2                     1               1
5               4                     5                     4               2
6               1                     1                     1               1

在填写成绩栏后,我会得到类似以下内容(fish19)

           species          BIN                                  collectors                          country grade species_frequency
1   Poecilothrissa congica BOLD:AAF7519                                 mljs et al, Democratic Republic of the Congo     D                 2
2    Acanthurus triostegus BOLD:AAA9362 Vinothkumar S, Kaleshkumar K and Rajaram R.                            India     A                54
3 Pseudogramma polyacantha BOLD:AAC5137                            Allan D. Connell                     South Africa     C                15
4   Pomadasys commersonnii BOLD:AAD1338                            Allan D. Connell                     South Africa     A                12
5       Secutor insidiator BOLD:AAB2487                            Allan D. Connell                     South Africa     E                18
6      Sebastes macdonaldi BOLD:AAJ7419                                Merit McCrea                    United States     B                 3
  BIN_per_species collector_per_species countries_per_species species_per_bin
1               2                     1                     1               1
2               1                    21                    15               1
3               3                     6                     6               1
4               1                     2                     1               1
5               4                     5                     4               2
6               1                     1                     1               1

两个数据框都有许多属于同一鱼类物种的标本,但事实是,应该为该物种的每个标本分配等级。我遇到的问题是,属于同一物种的某些行具有不同的等级,尤其是在等级“ C”和“ E”的情况下。我想将其合并到ifelse函数中的方法是:每次出现数据框时,都将其从“ C”级更改为“ E”,其中同一行中的两个或多个标本在一行中分配为“ C”,在另一行中分配为“ E”行。因为如果一个物种的等级为“ E”,那么具有该物种名称的其他所有行也应该都具有等级“ E”。

到目前为止,我已经尝试了%in%函数,仅使用“ ==”

尝试%in%

assign_grades=function(fish18){
  fish19<-fish18 %>%
    mutate(grade = ifelse(species_frequency<3,"D",ifelse(BIN_per_species==1 & (collector_per_species>1 | countries_per_species>1),"A",ifelse(BIN_per_species==1 & collector_per_species==1 | countries_per_species==1,"B",ifelse(BIN_per_species>1 & species_per_bin==1,"C",ifelse(species_per_bin>1,"E",ifelse(fish19$species[fish19$grade=="E"]%in%fish19$species[fish19$grade=="C"]==TRUE,"E",NA))) ))))
  assign('fish19',fish19,envir=.GlobalEnv)
}
assign_grades(fish18)

尝试使用“ ==“

assign_grades=function(fish18){
  fish19<-fish18 %>%
    mutate(grade = ifelse(species_frequency<3,"D",ifelse(BIN_per_species==1 & (collector_per_species>1 | countries_per_species>1),"A",ifelse(BIN_per_species==1 & collector_per_species==1 | countries_per_species==1,"B",ifelse(BIN_per_species>1 & species_per_bin==1,"C",ifelse(species_per_bin>1,"E",ifelse(fish19$species[fish19$grade=="E"]==fish19$species[fish19$grade=="C"],"E",NA))) ))))
  assign('fish19',fish19,envir=.GlobalEnv)
}
assign_grades(fish18)

这两个选项均不起作用,并且此更改的输出应该是,如果某个特定物种名称的一个事件被分配了等级“ E”,那么具有相同物种名称的所有其他事件也应该被分配。 很抱歉,这很令人困惑,但我想尽我所能,请在此先感谢您的答复。

1 个答案:

答案 0 :(得分:0)

答案很长,但是:

dat = data.frame('species'=c('a','b','c','a','a','b'),'grade'=c('E','E','C','C','C','D'))
dat %>% left_join(dat %>% 
                    group_by(species) %>% 
                    summarize(sum_e = sum(grade=='E')),by='species')

然后您可以对sum_e> 0