如何使用 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
我有一个数据框,我想在其中调整字符向量,然后再绘制它。我的数据框 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