簡體   English   中英

如何重命名 R 中不同數據框中不同列中的觀察值?

[英]How to rename observations in different columns in different dataframes in R?

我想將“名稱”添加到開頭,並將“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)

最簡單的可能是刪除“名稱”和“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

您可以試試這個 function,它允許分別編輯兩個數據框,並且可以處理以“名稱...”開頭的任意數量的列。 基於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")))

代表 package (v0.3.0) 於 2021 年 1 月 17 日創建

您可以先從名稱中刪除混淆字符串,然后再刪除 append 'name' 和 '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"

代表 package (v0.3.0) 於 2021 年 1 月 17 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM