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

时间:2015-03-11 11:21:53

标签: r 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)......它会改善我在其他地方的工作流程。我不禁想到它应该是可能的。在可能的情况下我错了,我会接受任何建议!提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以使用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

使用extract

中的tidyr
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)

答案 1 :(得分:1)

如果您想要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