在 R 中拆分具有不同语法的列
Splitting coloumn with differing syntax in R
我在清理数据时遇到了一些问题。它包含已售出房屋的清单。它由售价组成,不。房间、m2 和地址。
如下所示,地址在一个字符串中。
Head(DF, 3)
Address Price m2 Rooms
Petersvej 1772900 Hoersholm 10.000 210 5
Annasvej 2B2900 Hoersholm 15.000 230 4
Krænsvej 125800 Lyngby C 10.000 210 5
A Mivs Alle 119800 Hjoerring 1.300 70 3
地址栏的语法是:道路名称、道路编号,后跟 4 位邮政编码和城市名称(有时是两个单词)。
还需要提取邮政编码..一直在看'stringi'包没能找到任何例子..
非常感谢任何指点
1) 在 tidyr 中使用 separate
将 Address
的子字段分成 3 个字段,将剩余的任何内容合并到最后一个字段中,然后使用 separate
再次拆分在第一个 separate
.
中生成的 Number
列中的最后 4 位数字
library(dplyr)
library(tidyr)
DF %>%
separate(Address, into = c("Road", "Number", "City"), extra = "merge") %>%
separate(Number, into = c("StreetNo", "Postal"), sep = -4)
给予:
Road StreetNo Postal City Price m2 Rooms CITY
1 Petersvej 77 2900 Hoersholm 10 210 5 Hoersholm
2 Annasvej 121B 2900 Hoersholm 15 230 4 Hoersholm
3 Krænsvej 12 5800 Lyngby C 10 210 5 C
2) 或者,在 Address
的子字段之间插入逗号,然后使用 separate
将子字段分开。它在下面注释中显示的输入中给出与 (1) 相同的结果。
DF %>%
mutate(Address = sub("(\S.*) +(\S+)(\d{4}) +(.*)", "\1,\2,\3,\4", Address)) %>%
separate(Address, into = c("Road", "Number", "Postal", "City"), sep = ",")
备注
可重现形式的输入DF
是:
DF <-
structure(list(Address = structure(c(3L, 1L, 2L), .Label = c("Annasvej 121B2900 Hoersholm",
"Krænsvej 125800 Lyngby C", "Petersvej 772900 Hoersholm"), class = "factor"),
Price = c(10, 15, 10), m2 = c(210L, 230L, 210L), Rooms = c(5L,
4L, 5L), CITY = structure(c(2L, 2L, 1L), .Label = c("C",
"Hoersholm"), class = "factor")), class = "data.frame", row.names = c(NA,
-3L))
更新
添加并修复了 (2)。
检查 splitstackshape 包中的 cSplit
函数
library(splitstackshape)
df_new <- cSplit(df, splitCols = "Address", sep = " ")
#This will split your address column into 4 different columns split at the space
#you can then add an ifelse block to combine the last 2 columns to make up the city like
df_new$City <- ifelse(is.na(df_new$Address_4), as.character(df_new$Address_3), paste(df_new$Address_3, df_new$Address_4, sep = " "))
一种方法是使用 regex。
在这种情况下,您可以使用一个简单的正则表达式来匹配所有字母字符和指向字符串末尾的 space 个字符,然后 trim 白色 space关闭。
library(stringr)
DF <- data.frame(Address=c("Petersvej 772900 Hoersholm",
"Annasvej 121B2900 Hoersholm",
"Krænsvej 125800 Lyngby C"))
DF$CITY <- str_trim(str_extract(DF$Address, "[a-zA-Z ]+$"))
这将为您提供以下输出:
Address CITY
1 Petersvej 772900 Hoersholm Hoersholm
2 Annasvej 121B2900 Hoersholm Hoersholm
3 Krænsvej 125800 Lyngby C Lyngby C
在 R 中,stringr
包是正则表达式的首选,因为它允许多组捕获,在这个例子中可以让你用一个表达式分隔地址的每个组成部分。
我在清理数据时遇到了一些问题。它包含已售出房屋的清单。它由售价组成,不。房间、m2 和地址。 如下所示,地址在一个字符串中。
Head(DF, 3)
Address Price m2 Rooms
Petersvej 1772900 Hoersholm 10.000 210 5
Annasvej 2B2900 Hoersholm 15.000 230 4
Krænsvej 125800 Lyngby C 10.000 210 5
A Mivs Alle 119800 Hjoerring 1.300 70 3
地址栏的语法是:道路名称、道路编号,后跟 4 位邮政编码和城市名称(有时是两个单词)。
还需要提取邮政编码..一直在看'stringi'包没能找到任何例子..
非常感谢任何指点
1) 在 tidyr 中使用 separate
将 Address
的子字段分成 3 个字段,将剩余的任何内容合并到最后一个字段中,然后使用 separate
再次拆分在第一个 separate
.
Number
列中的最后 4 位数字
library(dplyr)
library(tidyr)
DF %>%
separate(Address, into = c("Road", "Number", "City"), extra = "merge") %>%
separate(Number, into = c("StreetNo", "Postal"), sep = -4)
给予:
Road StreetNo Postal City Price m2 Rooms CITY
1 Petersvej 77 2900 Hoersholm 10 210 5 Hoersholm
2 Annasvej 121B 2900 Hoersholm 15 230 4 Hoersholm
3 Krænsvej 12 5800 Lyngby C 10 210 5 C
2) 或者,在 Address
的子字段之间插入逗号,然后使用 separate
将子字段分开。它在下面注释中显示的输入中给出与 (1) 相同的结果。
DF %>%
mutate(Address = sub("(\S.*) +(\S+)(\d{4}) +(.*)", "\1,\2,\3,\4", Address)) %>%
separate(Address, into = c("Road", "Number", "Postal", "City"), sep = ",")
备注
可重现形式的输入DF
是:
DF <-
structure(list(Address = structure(c(3L, 1L, 2L), .Label = c("Annasvej 121B2900 Hoersholm",
"Krænsvej 125800 Lyngby C", "Petersvej 772900 Hoersholm"), class = "factor"),
Price = c(10, 15, 10), m2 = c(210L, 230L, 210L), Rooms = c(5L,
4L, 5L), CITY = structure(c(2L, 2L, 1L), .Label = c("C",
"Hoersholm"), class = "factor")), class = "data.frame", row.names = c(NA,
-3L))
更新
添加并修复了 (2)。
检查 splitstackshape 包中的 cSplit
函数
library(splitstackshape)
df_new <- cSplit(df, splitCols = "Address", sep = " ")
#This will split your address column into 4 different columns split at the space
#you can then add an ifelse block to combine the last 2 columns to make up the city like
df_new$City <- ifelse(is.na(df_new$Address_4), as.character(df_new$Address_3), paste(df_new$Address_3, df_new$Address_4, sep = " "))
一种方法是使用 regex。
在这种情况下,您可以使用一个简单的正则表达式来匹配所有字母字符和指向字符串末尾的 space 个字符,然后 trim 白色 space关闭。
library(stringr)
DF <- data.frame(Address=c("Petersvej 772900 Hoersholm",
"Annasvej 121B2900 Hoersholm",
"Krænsvej 125800 Lyngby C"))
DF$CITY <- str_trim(str_extract(DF$Address, "[a-zA-Z ]+$"))
这将为您提供以下输出:
Address CITY
1 Petersvej 772900 Hoersholm Hoersholm
2 Annasvej 121B2900 Hoersholm Hoersholm
3 Krænsvej 125800 Lyngby C Lyngby C
在 R 中,stringr
包是正则表达式的首选,因为它允许多组捕获,在这个例子中可以让你用一个表达式分隔地址的每个组成部分。