我一直在争论从各种数据库访问的一些数据,现在有两列在某些行中包含重复信息,但在其他行中没有。我想将这两列合并,但如果信息重复,则只保留一组信息。
下面是我的数据的一个例子:
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)