r-将列内容与某些行中的重复信息组合在一起



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

下面是我的数据的一个例子:

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,并列出两次重复数据。我曾考虑过编写一个逐行执行的函数,但一直未能获得正确的语法。

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

非常感谢您的帮助!

编辑:出于好奇,有人有数据表或基本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))

数据表解决方案

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

相关内容

  • 没有找到相关文章

最新更新