【发布时间】:2022-01-18 17:30:30
【问题描述】:
我一直在处理从各种数据库访问的一些数据,现在有两列在某些行中包含重复信息,但在其他行中不包含重复信息。我想合并这两列,但如果重复,只保留一组信息。
这是我的数据的示例:
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 解决方案吗?
【问题讨论】:
标签: r dataframe duplicates multiple-columns