拆分具有多个分隔符的列

时间:2014-08-06 19:30:25

标签: r split

我试图在R中确定如何拆分具有多个分隔符的多个字段的列。

从API中,我在名为“Location”的数据框中得到一列。它中有多个位置标识符。这是一个条目的示例。 (编辑 - 我添加了几个)

6540 BENNINGTON AVE
Kansas City, MO 64133
(39.005620414000475, -94.50998643299965)

4284 E 61ST ST
Kansas City, MO 64130
(39.014638172000446, -94.5335298549997)


3002 SPRUCE AVE
Kansas City, MO 64128
(39.07083265200049, -94.53320606399967)


6022 E Red Bridge Rd
Kansas City, MO 64134
(38.92458893200046, -94.52090062499968)

所以上面是第1-4行的栏目“location”。

我希望将其拆分为地址,城市,州,邮政编码,长列和纬度列。某些字段由空格或制表符分隔,而其他字段由逗号分隔。也没有固定的宽度。

我看过reshape包 - 但似乎我需要一个单一的分隔符。我不能使用空间(或者我可以?),因为地址中有空格。

思想?

2 个答案:

答案 0 :(得分:2)

如果您拥有的数据不是这样的,请通过添加我们可以复制并粘贴到R中的代码来让每个人都知道以重现您的数据(请参阅如何轻松地将此样本数据复制并粘贴到R中?)

示例数据:

location <- c(
"6540 BENNINGTON AVE
Kansas City, MO 64133
(39.005620414000475, -94.50998643299965)",

"456 POOH LANE
New York City, NY 10025
(40, -90)")

location
#[1] "6540 BENNINGTON AVE\nKansas City, MO 64133\n(39.005620414000475, -94.50998643299965)"
#[2] "456 POOH LANE\nNew York City, NY 10025\n(40, -90)"

解决方案:

# Insert a comma between the state abbreviation and the zip code
step1 <- gsub("([[:alpha:]]{2}) ([[:digit:]]{5})", "\\1,\\2", location)
# get rid of parentheses
step2 <- gsub("\\(|\\)", "", step1)
# split on "\n", ",", and ", "
strsplit(step2, "\n|,|, ")

#[[1]]
#[1] "6540 BENNINGTON AVE" "Kansas City"         "MO"                
#[4] "64133"               "39.005620414000475"  "-94.50998643299965"

#[[2]]
#[1] "456 POOH LANE"  "New York City" "NY"           "10025"        
#[5] "40"            "-90" 

答案 1 :(得分:2)

以下是stringr包的示例。 使用上面的@ Frank示例数据,您可以执行以下操作:

library(stringr)
address <- str_match(location,
                     "(^[[:print:]]+)[[:space:]]([[:alpha:]. ]+), ([[:alpha:]]{2}) ([[:digit:]]{5})[[:space:]][(]([[:digit:].-]+), ([[:digit:].-]+)")
address <- data.frame(address[,-1]) # get rid of the first column which has the full match
names(address) <- c("address", "city", "state", "zip", "lat", "lon")

> address
              address          city state   zip                lat                lon
1 6540 BENNINGTON AVE   Kansas City    MO 64133 39.005620414000475 -94.50998643299965
2       456 POOH LANE New York City    NY 10025                 40                -90

请注意,这非常特定于给定的一个条目的格式。如果有多种方式存在差异,则需要进行调整。 这将从字符串的开头到第一个[:space:]字符为address。直到下一个逗号的下一组字母,空格和句点被赋予city。在逗号和空格之后,接下来的两个字母将被赋予state。在空格后,接下来的五位数组成zip字段。最后,下一组数字,句号和/或减号分别被分配到latlon

相关问题