将列内容与某些行中的重复信息组合

Combining column contents with duplicate information in some rows

我一直在争论从各种数据库访问的一些数据,现在有两列在某些行中包含重复信息,但在其他行中不包含。我想合并这两列,但如果重复,则只保留一组信息。

这是我的数据的示例:

species <- c('taxon1', 'taxon2', 'taxon3', 'taxon4', 'taxon 5', 'taxon6','taxon7','taxon8')
continentmax <- c(NA,'North America','Oceania','Europe, North America, and Oceania',NA,NA,'Europe',NA)
continentmin <- c('South America','North America',NA,'Europe, North America, and Oceania',NA,NA,'Europe','Asia')

df <- data.frame(species, continentmax, continentmin)

  species                       continentmax                       continentmin
1  taxon1                               <NA>                      South America
2  taxon2                      North America                      North America
3  taxon3                            Oceania                               <NA>
4  taxon4 Europe, North America, and Oceania Europe, North America, and Oceania
5 taxon 5                               <NA>                               <NA>
6  taxon6                               <NA>                               <NA>
7  taxon7                             Europe                             Europe
8  taxon8                               <NA>                               Asia

有些行都是NA,有些有重复的信息,有些只有一列有信息。我想要一个合并的大洲列作为输出,如下所示:

 species                          continent
1  taxon1                      South America
2  taxon2                      North America
3  taxon3                            Oceania
4  taxon4 Europe, North America, and Oceania
5 taxon 5                               <NA>
6  taxon6                               <NA>
7  taxon7                             Europe
8  taxon8                               Asia

我试过 df$continent <- paste(df$continentmax, df$continentmin, collapse = ',') 但结果列的每一行都填满了所有大洲。 当我使用 df$continent <- paste(unique(c(df$continentmax[1], df$continentmin[1])), collapse = ',') 时,我得到了大致所需的结果,但仅限于第一行,并且 NA 也被粘贴为文本。我有2000多行所以这个方法不可行

我也尝试过使用 sapply 和使用 mutate 的整洁方式,但都无济于事。我最接近的是使用 df$continent <- do.call(paste, c(df[2:3], sep = ",")) 结果:

  species                                                             continent
1  taxon1                                                      NA,South America
2  taxon2                                           North America,North America
3  taxon3                                                            Oceania,NA
4  taxon4 Europe, North America, and Oceania,Europe, North America, and Oceania
5 taxon 5                                                                 NA,NA
6  taxon6                                                                 NA,NA
7  taxon7                                                         Europe,Europe
8  taxon8                                                               NA,Asia

每行中都有所需的信息,但包含 NA,并且列出了两次重复数据。我考虑过编写一个逐行执行的函数,但无法获得正确的语法。

关于如何处理这个问题有什么想法吗?在有关合并列内容的许多条目中,我没有找到任何适合我的答案。

非常感谢任何帮助!

编辑:出于好奇,有人有 data.table 或基础 R 解决方案吗?

这个怎么样...

library(dplyr)

df %>%
  mutate(continent = case_when(continentmax == continentmin ~ continentmax,
                           is.na(continentmax) & !is.na(continentmin) ~ continentmin,
                           !is.na(continentmax) & is.na(continentmin) ~ continentmax,
                           is.na(continentmax) & is.na(continentmin) ~ NA_character_))

或者更高效...你也可以使用这个。

df %>%
  rowwise() %>%
  mutate(continent = max(continentmax, continentmin, na.rm = T))

data.table解决方案

library(data.table)
df.dt = as.data.table(df)
df.dt2 = df.dt[,continent:=pmin(continentmax, continentmin, na.rm = T)]
head(df.dt2)