如何根据不同长度的数据框中的条件填充数据框中的列?

时间:2019-06-02 16:55:10

标签: r

所以我有两个数据框,第一个是这样,用不同种类的海鱼的名字(在整个数据框中重复相同的种类,共有74610个条目),分别是其BIN(一种序列基于聚类算法分配给物种的数字),以及我要根据第二个数据帧中的条件填充的空列(等级):

dataframe1

         species               BIN        grade
1.  Tilapia guineensis |  BOLD:AAL5979  |  NA

2.     Tilapia zillii  |  BOLD:AAB9042  |  NA

3. Fundulus rubrifrons |  BOLD:AAI7245  |  NA

4.  Eutrigla gurnardus |  BOLD:AAC0262  |  NA

5.   Sprattus sprattus |  BOLD:AAE9187  |  NA

6.        Gadus morhua |  BOLD:ACF1143  |  NA

第二个数据帧具有物种(这次仅重复一次,总共只有7633个条目)以及分配给每个物种的BIN数量:

dataframe2

        species             bin_per_species       BIN

1. Abalistes filamentosus |       1        |  BOLD:AAD4738

2. Abalistes stellaris    |       2        |  BOLD:AAD4739,BOLD:ACK7828 

3. Abalistes stellatus    |       2        |  BOLD:AAD4739,BOLD:ACK7828 

4. Ablabys binotatus      |       1        |  BOLD:AAF8834   

5. Ablennes hians         |       2        |  BOLD:AAC1231,BOLD:AAB9824

6. Abramis brama          |       1        |  BOLD:AAC8592               

考虑到分配给dataframe2中每个物种的BIN数量,我想要做的基本上是填充dataframe1中的成绩列。例如,如果在dataframe2中某个物种的bin_per_species == 1,我要指定等级“ A”,但是,例如,如果在dataframe2中某个物种的bin_per_species> 1,我要指定等级“ C”。

我尝试使用%in%函数,因为我不能使用“ ==”,因为它们的长度不同。

尝试失败

dataframe1$grade[(as.character(dataframe1$species)%in%as.character(dataframe2$species))[dataframe2$bin_per_species==1]]="A"

我希望根据条件填充dataframe1,但是发生的是,当我尝试上面的代码时,它只是用“ A”级填充每个单元格。 很抱歉,如果我在提出问题时感到困惑,但在此先感谢您的答复。

3 个答案:

答案 0 :(得分:0)

欢迎

请检查是否可行,并查看dput()函数。

library(tidyverse)

df <- tribble(~species,~BIN,
              "A",1,
              "B",2,
              "B",3,
              "B",4)

df %>% 
  group_by(species) %>% 
  summarise(count_bins = n()) %>% 
  mutate(grade = if_else(count_bins > 1,
                         "C",
                         "A")) %>% 
  right_join(df)

答案 1 :(得分:0)

为了简化测试,我简化了您的问题,如果对您不起作用,请通知我。我保留了简单的数据框,以便您可以进行我的处理。

df1 <- data.frame(
  species <- c('a', 'b', 'c', 'd'),
  grade <- c(NA, NA, NA, NA)
)
colnames(df1) <- c('species', 'grade')

df2 <- data.frame(
  species <- c('a', 'b', 'c', 'd'),
  bin_per_species <- c(1, 2, 2, 1)
)
colnames(df2) <- c('species', 'bin_per_species')

df1[species %in% df2[which(df2[, 'bin_per_species'] == 2), 'species'], 'grade'] <- 'A'

答案 2 :(得分:0)

不幸的是,您的两个数据帧不是很有帮助,但是我认为可以从第二个数据帧向后工作以获得更具有代表性的数据。根据您的评论,第一个数据帧可以包含相同的species和不同的BIN。如果是这种情况,那么我们可以拆开第二个数据帧以获得df1

# A tibble: 9 x 3
  species                BIN          grade
  <chr>                  <chr>        <int>
1 Abalistes filamentosus BOLD:AAD4738    NA
2 Abalistes stellaris    BOLD:AAD4739    NA
3 Abalistes stellatus    BOLD:AAD4739    NA
4 Ablabys binotatus      BOLD:AAF8834    NA
5 Ablennes hians         BOLD:AAC1231    NA
6 Abramis brama          BOLD:AAC8592    NA
7 Abalistes stellaris    BOLD:ACK7828    NA
8 Abalistes stellatus    BOLD:ACK7828    NA
9 Ablennes hians         BOLD:AAB9824    NA

第二个数据帧df2保持不变。

使用一个数据帧

如果我已正确理解问题,那么您甚至根本不需要第二个数据帧。相反,您可以执行类似的操作,将species分组,并根据其大小n()为每个分组评分:

df1 %>% 
    group_by(species) %>% 
    mutate(grade = ifelse(n() == 1, "A", "C"))

#### OUTPUT ####

# A tibble: 9 x 3
# Groups:   species [6]
  species                BIN          grade
  <chr>                  <chr>        <chr>
1 Abalistes filamentosus BOLD:AAD4738 A    
2 Abalistes stellaris    BOLD:AAD4739 C    
3 Abalistes stellatus    BOLD:AAD4739 C    
4 Ablabys binotatus      BOLD:AAF8834 A    
5 Ablennes hians         BOLD:AAC1231 C    
6 Abramis brama          BOLD:AAC8592 A    
7 Abalistes stellaris    BOLD:ACK7828 C    
8 Abalistes stellatus    BOLD:ACK7828 C    
9 Ablennes hians         BOLD:AAB9824 C    

使用两个数据帧

如果由于某种原因需要使用df1df2,我认为最直接的方法是将species上的两个数据帧合并,然后将{{ 1}}根据grade的值:

bin_per_species

如果您的成绩不只是两个等级“ A”和“ C”,我会提供full_join(df1, df2, by = "species") %>% mutate(grade = case_when(bin_per_species == 1 ~ "A", bin_per_species == 2 ~ "B", bin_per_species > 2 ~ "C", )) %>% select(1:3) #### OUTPUT #### # A tibble: 9 x 3 species BIN.x grade <chr> <chr> <chr> 1 Abalistes filamentosus BOLD:AAD4738 A 2 Abalistes stellaris BOLD:AAD4739 B 3 Abalistes stellatus BOLD:AAD4739 B 4 Ablabys binotatus BOLD:AAF8834 A 5 Ablennes hians BOLD:AAC1231 B 6 Abramis brama BOLD:AAC8592 A 7 Abalistes stellaris BOLD:ACK7828 B 8 Abalistes stellatus BOLD:ACK7828 B 9 Ablennes hians BOLD:AAB9824 B 。您也可以在“一个数据框”解决方案中使用它。如果您确实只有这两个年级,则可以使用case_when()简化操作:

ifelse()