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