【问题标题】:Combining column contents with duplicate information in some rows将列内容与某些行中的重复信息相结合
【发布时间】: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 &lt;- paste(df$continentmax, df$continentmin, collapse = ','),但结果列的每一行都填满了所有大陆。 当我使用 df$continent &lt;- paste(unique(c(df$continentmax[1], df$continentmin[1])), collapse = ',') 时,我得到了大约所需的结果,但仅适用于第一行,并且 NA 也被粘贴为文本。我有超过 2000 行,所以这种方法不可行。

我也尝试过使用 sapply 和使用 mutate 的整洁方式,但无济于事。我最接近的是使用df$continent &lt;- 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


    【解决方案1】:

    这个怎么样...

    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)
    

    【讨论】:

    • 第一种方法运行良好,第二种方法导致错误“mutate()continent 出现问题。我 continent = max(continentmax, continentmin, na.rm = T)。我没有非缺失参数,返回 NA”两个值都是 NA
    • 对于第二种方法,我得到的是警告而不是错误。输出很好。你可以检查并告诉我!
    • 你是对的,这只是一个警告,输出很好-谢谢!
    • 我添加了data.table解决方案
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多