【问题标题】:How to rename observations in different columns in different dataframes in R?如何重命名R中不同数据框中不同列中的观察值?
【发布时间】:2021-04-21 21:34:22
【问题描述】:

我想在不同数据帧的不同列中的观察名称的开头添加“名称”,在末尾添加“plc”,除了名称已经有“名称”或“plc”在正确的位置。以下是一个简单的表示。

原始数据帧

names1a <- c("Name Alperton plc", "Bury", "Central", "Durham")
names1b <- c("Egham plc", "Fulton", "Great", "Heywood plc")
year1 <- c(1999, 2000, 2001, 2001)
df1 <- data.frame(names1a, names1b, year1)

names2 <- c("Charleton plc", "Birmingham", "Name Tees", "Salford")
year2 <- c(2000, 1955, 2001, 2001)
df2 <- data.frame(names2, year2)

期望的结果:

df1


            names1a          names1b year1
1 Name Alperton plc   Name Egham plc  1999
2     Name Bury plc  Name Fulton plc  2000
3  Name Central plc   Name Great plc  2001
4   Name Durham plc Name Heywood plc  2001

df2

               names2 year2
1  Name Charleton plc  2000
2 Name Birmingham plc  1955
3       Name Tees plc  2001
4    Name Salford plc  2001

我的方法:我得到了我想要的结果,但是我有一个包含很多列的大型数据集,所以我的方法太重复了。我努力制作函数,我认为这里会有用:

df1$names1a <- sub("$", " plc", df1$names1a)
df1$names1b <- sub("$", " plc", df1$names1b)
df2$names2 <- sub("$", " plc", df2$names2)
df1$names1a <- sub("plc plc", "plc", df1$names1a)
df1$names1b <- sub("plc plc", "plc", df1$names1b)
df2$names2 <- sub("plc plc", "plc", df2$names2)

df1$names1a <- sub("^", "Name ", df1$names1a)
df1$names1b <- sub("^", "Name ", df1$names1b)
df2$names2 <- sub("^", "Name ", df2$names2)
df1$names1a <- sub("Name Name", "Name", df1$names1a)
df1$names1b <- sub("Name Name", "Name", df1$names1b)
df2$names2 <- sub("Name Name", "Name", df2$names2)

【问题讨论】:

    标签: r rename


    【解决方案1】:

    您可以试试这个功能,它允许分别编辑两个数据框,并且可以处理以“名称...”开头的任意数量的列。基于tidyverse 包:

    
    library(dplyr)
    library(stringr)
    
      fun <- function(df){
        df <-
          df %>% 
          mutate(across(starts_with("names"), ~ str_replace_all(., "^Name | plc$", "")),
                 across(starts_with("names"), ~ paste("Name", .,  "plc")))
        return(df)
      }
      
    fun(df = df1)
    #>             names1a          names1b year1
    #> 1 Name Alperton plc   Name Egham plc  1999
    #> 2     Name Bury plc  Name Fulton plc  2000
    #> 3  Name Central plc   Name Great plc  2001
    #> 4   Name Durham plc Name Heywood plc  2001
      
    fun(df2)
    #>                names2 year2
    #> 1  Name Charleton plc  2000
    #> 2 Name Birmingham plc  1955
    #> 3       Name Tees plc  2001
    #> 4    Name Salford plc  2001
    

    您可以将两个 mutate 函数合二为一:

    mutate(across(starts_with("names"), ~ paste("Name", str_replace_all(., "^Name | plc$", ""), "plc")))

    reprex package (v0.3.0) 于 2021 年 1 月 17 日创建

    【讨论】:

      【解决方案2】:

      最简单的方法可能是删除“名称”和“plc”,然后将其添加到所有内容中,如下所示:

      f <- function(x) paste("Name", trimws(gsub("^Name|plc$", "", x)), "plc")
      
      cols <- c("names1a", "names1b")
      df1[cols] <- lapply(df1[cols], f)
      df1
      #          names1a         names1b year1
      # 1 Name Arton plc    Name Egh plc  1999
      # 2  Name Bury plc  Name Futon plc  2000
      # 3  Name Cntr plc    Name Grt plc  2001
      # 4  Name Durh plc Name Hywood plc  2001
      
      df2$names2 <- f(df2$names2)
      df2
      #             names2 year2
      # 1  Name Chrton plc  2000
      # 2 Name Biringh plc  1955
      # 3      Name Ts plc  2001
      # 4   Name Sford plc  2001
      

      【讨论】:

        【解决方案3】:

        您可以先从名称中删除混淆字符串,然后根据需要附加“名称”和“plc”:

        library(tidyverse)
        
        names1a <- c("Name Alperton plc", "Bury", "Central", "Durham")
        
        names1a <- str_replace_all(names1a, "Name ", "")
        names1a <- str_replace_all(names1a, " plc", "")
        names1a <- paste0("Name ", names1a, " plc")
        
        names1a
        #> [1] "Name Alperton plc" "Name Bury plc"     "Name Central plc" 
        #> [4] "Name Durham plc"
        

        reprex package (v0.3.0) 于 2021-01-17 创建

        【讨论】:

          猜你喜欢
          • 2021-07-13
          • 2023-02-01
          • 1970-01-01
          • 2021-03-18
          • 1970-01-01
          • 2020-03-26
          • 2022-11-14
          • 1970-01-01
          • 2023-01-27
          相关资源
          最近更新 更多