我有一个数据框,我想在绘制之前调整一个字符向量。我的数据框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)......它会改善我在其他地方的工作流程。我不禁想到它应该是可能的。在可能的情况下我错了,我会接受任何建议!提前致谢。
答案 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