如何使用 dplyr 重命名一串字符向量?

How can I rename a string of character vectors using dplyr?

我有一个数据框,我想在其中调整字符向量,然后再绘制它。我的数据框 available here 有 140,000 多行,大约有40 个标签表示一个位置 - 在本例中是悉尼的地方政府区域。当前 'LGA_NAME11' 列中的每个名称后跟 (A) 或 (C),表示它们所属的地方政府区域类型。我有兴趣删除括号。

我目前正在使用 ifelse 语句将当前值替换为附加值。将其称为次优是一种轻描淡写的说法。我一直在为每个变体写一个声明。

sydneyMapData <- sydneyMapData %>%
    mutate(LGA_NAME11 =
            ifelse(LGA_NAME11 == "Ashfield (A)", "Ashfield",
            ifelse(LGA_NAME11 == "Auburn (C)", "Auburn",
            ifelse(LGA_NAME11 == "Bankstown (C)", "Bankstown",
            1))))
            etc...

我也在一个更大的数据集上重复这个练习,当我有超过 50 个 ifelse 语句时,R 似乎不喜欢它。

我有兴趣尝试找到一个更简单的 dplyr 解决方案(主要是因为我喜欢 dplyr)...它会改善我在其他地方的工作流程。我不禁认为这应该是可能的。万一我错了,我愿意接受任何建议!提前致谢。

你可以使用 sub

v1 <- c("Ashfield (A)", "Auburn (C)", "Bankstown (C)")
sub(' \([^)]+\).*$', '', v1)
#[1] "Ashfield"  "Auburn"    "Bankstown"

使用您的原始数据集

dim(sydneyMapData)
#[1] 142459     13
system.time(sydneyMapData$LGA_NAME11 <- sub(' \([^)]+\).*$', '', 
             sydneyMapData$LGA_NAME11))
#  user  system elapsed 
# 0.087   0.000   0.088 
head(sydneyMapData,2)
#   LGA_NAME11 id     long       lat order  hole piece group STATE_CODE
#1 1   Ashfield  2 151.1212 -33.89556 85104 FALSE     1   2.1          1
#2 2   Ashfield  2 151.1211 -33.89556 85105 FALSE     1   2.1          1
#  LGA_CODE11  Factor1 Factor2
#1      10150 10-14.99 200-500
#2      10150 10-14.99 200-500

使用 tidyr

中的 extract
library(tidyr)
system.time(extract(sydneyMapData, LGA_NAME11, 
          into='LGA_NAME11', '([^\( ]+) \(.*\)'))
#   user  system elapsed 
#  1.631   0.001   1.636 

library(stringi)
system.time(stri_extract(sydneyMapData[,2], regex='^[^\( ]+'))
 # user  system elapsed 
# 0.051   0.000   0.047 

更新

根据提供的数据,以下代码有效

sydneyMapData$LGA_NAME11[c(3,8)] <- 'Other'
res <- extract(sydneyMapData, LGA_NAME11, 
                       into='LGA_NAME11', '([^\( ]+)')
head(res$LGA_NAME11)
#[1] "Ashfield" "Ashfield" "Other"    "Ashfield" "Ashfield" "Ashfield"

数据

sydneyMapData <- read.csv('mapData.csv', header=TRUE, 
             check.names=FALSE, stringsAsFactors=FALSE)

如果你想要一个dplyr的解决方案,mutate不是最简单的吗?

如果您只想删除 () 及其中的所有内容

sub("\s*\(.*\)$","","Ashfield (A)") # returns "Ashfield"

如果您想将 () 中的本地政府类型保留为单独的变量:

sub("^.*\((.*)\)$","\1","Ashfield (A)")   # returns "A"

因此

sydneyMapData %>% 
     mutate(local_govt_type = sub("^.*\((.*)\)$","\1",LGA_NAME11),
            LGA_NAME11 = sub("\s*\(.*\)$","", LGA_NAME11) ) -> sydneyMapData