【问题标题】:Merge and replace character columns合并和替换字符列
【发布时间】:2021-01-16 13:20:45
【问题描述】:

我有一个要合并的包含 2 列的数据框:

     Region             PA
1     Mbeya    Ruaha National Park
2     Mbeya    Ruaha National Park
3     Mbeya    Ruaha National Park
4     Mbeya    Ruaha National Park
5     Mbeya    Ruaha National Park
6     Mbeya    Ruaha National Park
7     Mbeya    NA
8     Mbeya    NA
9     Mbeya    NA
10    Mbeya    NA

这可以通过采用 PA 值并覆盖行中的 Region 值来合并,或者将 PA 中的所有 NA 替换为该行的 Region 中的值。

我试过了:

  Carcass.cleaned$New<-rowSums(Carcass.cleaned[, c("PA", "Region")], na.rm=T)
    Error in base::rowSums(x, na.rm = na.rm, dims = dims, ...) : 
      'x' must be numeric
    
    with(Carcass.cleaned,ifelse(is.na(PA),Region,PA))
    (returns list of numbers)
    
    and coalesce(Carcass.cleaned$PA, Carcass.cleaned$Region) 
    unite(Carcass.cleaned, new, PA:Region, sep='') 
 (both merge the columns names instead of replacing)

【问题讨论】:

    标签: r dplyr merge coalesce


    【解决方案1】:

    您可以使用简单的 if else 语句:

    df$Region <- ifelse(is.na(df$PA), df$Region, df$PA)
    

    基本上,只要 PA 为 NA,您就可以保持 Region 不变,而 PA 有值时,您会覆盖 Region 中的值。后记如果你愿意,你可以删除 PA

    【讨论】:

      【解决方案2】:

      尝试使用来自dplyrmutate()

      library(tidyr)
      library(dplyr)
      #Code
      df <- df %>% group_by(Region) %>% 
        mutate(PA=ifelse(is.na(PA),Region,PA))
      

      输出:

      # A tibble: 10 x 2
      # Groups:   Region [1]
         Region PA                 
         <chr>  <chr>              
       1 Mbeya  Ruaha National Park
       2 Mbeya  Ruaha National Park
       3 Mbeya  Ruaha National Park
       4 Mbeya  Ruaha National Park
       5 Mbeya  Ruaha National Park
       6 Mbeya  Ruaha National Park
       7 Mbeya  Mbeya              
       8 Mbeya  Mbeya              
       9 Mbeya  Mbeya              
      10 Mbeya  Mbeya       
      

      使用的一些数据:

      #Data
      df <- structure(list(Region = c("Mbeya", "Mbeya", "Mbeya", "Mbeya", 
      "Mbeya", "Mbeya", "Mbeya", "Mbeya", "Mbeya", "Mbeya"), PA = c("Ruaha National Park", 
      "Ruaha National Park", "Ruaha National Park", "Ruaha National Park", 
      "Ruaha National Park", "Ruaha National Park", NA, NA, NA, NA)), row.names = c(NA, 
      -10L), class = "data.frame")
      

      【讨论】:

        【解决方案3】:

        我们可以使用来自dplyrcoalesce

        library(dplyr)
        df %>%
           mutate(PA = coalesce(PA, Region))
        #   Region                  PA
        #1   Mbeya Ruaha National Park
        #2   Mbeya Ruaha National Park
        #3   Mbeya Ruaha National Park
        #4   Mbeya Ruaha National Park
        #5   Mbeya Ruaha National Park
        #6   Mbeya Ruaha National Park
        #7   Mbeya               Mbeya
        #8   Mbeya               Mbeya
        #9   Mbeya               Mbeya
        #10  Mbeya               Mbeya
        

        或者在data.table中使用fcoalesce

        library(data.table)
        setDT(df)[, PA := fcoalesce(PA, Region)]
        

        数据

        df <- structure(list(Region = c("Mbeya", "Mbeya", "Mbeya", "Mbeya", 
        "Mbeya", "Mbeya", "Mbeya", "Mbeya", "Mbeya", "Mbeya"), PA = c("Ruaha National Park", 
        "Ruaha National Park", "Ruaha National Park", "Ruaha National Park", 
        "Ruaha National Park", "Ruaha National Park", NA, NA, NA, NA)), row.names = c(NA, 
        -10L), class = "data.frame")
        

        【讨论】:

          【解决方案4】:

          您可以将PA 中的NA 值替换为对应的Region 值。

          df$PA[is.na(df$PA)] <- df$Region[is.na(df$PA)]
          df
          #   Region                  PA
          #1   Mbeya Ruaha National Park
          #2   Mbeya Ruaha National Park
          #3   Mbeya Ruaha National Park
          #4   Mbeya Ruaha National Park
          #5   Mbeya Ruaha National Park
          #6   Mbeya Ruaha National Park
          #7   Mbeya               Mbeya
          #8   Mbeya               Mbeya
          #9   Mbeya               Mbeya
          #10  Mbeya               Mbeya
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-06-19
            • 2022-08-17
            • 2019-07-31
            • 2021-12-13
            • 2013-01-28
            • 1970-01-01
            • 2013-07-10
            相关资源
            最近更新 更多