【问题标题】:Split column with multiple delimiters使用多个分隔符拆分列
【发布时间】:2014-08-06 19:30:25
【问题描述】:

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

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

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 行“位置”列中的条目。

我想将其拆分为地址、城市、州、邮编、长列和纬度列。一些字段由空格或制表符分隔,而另一些则由逗号分隔。也没有什么是固定宽度。

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

想法?

【问题讨论】:

  • strsplit 允许您指定用于拆分的正则表达式。你甚至尝试过使用它吗?
  • 在我看来您想要多行阅读。发布一个更完整的数据示例,比如 12-15 行数据。
  • 如果您在 R 中名为“Location”的数据框中已有名为“location”的列。发布head(Location$location, 3)dput(Location$location[1:3] 的输出。你可能想好好看看how to make a great R reproducible example。另外,在不相关的说明中,您知道您可以投票吗?我之所以问,是因为我注意到您从未投票过。
  • 了解该格式是否还有其他模式也会很有帮助。例如,这些都是美国地址吗?地址格式在国际上有所不同。您显示的三行中的每一行是否总是由换行符或制表符分隔,并且它们的顺序是否始终相同?国家总是缩写还是有些写出来?邮政编码总是只有 5 位数字版本还是有时是 5 + 4 位数字版本?或者,您是否只关心提取 4 位数字?
  • 我又添加了几行(这是来自 KCMO 开源的所有公开数据)。如您所见,格式基本相同。我喜欢添加逗号,然后拆分的想法。会玩的。

标签: r split


【解决方案1】:

如果你的数据不是这样的,通过添加代码让大家知道我们可以复制粘贴到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" 

【讨论】:

  • 没有更多信息的好解决方案。以防万一,请注意,如果您的乡村路线的第一行是“RR 1234 STREETNAME ST”,则 step1 可能会失败。
  • @Cotton.Rockwood 感谢您指出这一点!我会等着看 OP 是否添加任何内容并回复您对该问题的评论。
  • 我又添加了几行(这是来自 KCMO 开源的所有公共数据)。如您所见,格式基本相同。我喜欢添加逗号,然后拆分的想法。会玩那个。我以前没有使用过那个功能。谢谢。
【解决方案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

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多