所以我有两个数据框,第一个是这样,用不同种类的海鱼的名字(在整个数据框中重复相同的种类,共有74610个条目),分别是其BIN(一种序列基于聚类算法分配给物种的数字),以及我要根据第二个数据帧中的条件填充的空列(等级):
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数量:
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”级填充每个单元格。 很抱歉,如果我在提出问题时感到困惑,但在此先感谢您的答复。
答案 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
如果由于某种原因需要使用df1
和df2
,我认为最直接的方法是将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()