【问题标题】:Disappearing row after string split字符串拆分后消失的行
【发布时间】:2017-09-29 16:41:56
【问题描述】:

我有一列坐标,我将其与strsplit() 分开,并从gsub() 中删除不需要的字符。请注意,共有 3034 行

> head(bike_parking$Geom)
[1] "(37.7606289177, -122.410647009)" "(37.752476948, -122.410625009)" 
[3] "(37.7871729481, -122.402401009)" "(37.7776039475, -122.422764009)"
[5] "(37.7658325695, -122.46649784)"  "(37.7693399479, -122.432820008)"

> length(bike_parking$Geom)
[1] 3034

 > sum(is.na(bike_parking$Geom))
[1] 0

由于某种原因,在我运行之后

dat <- data.frame(do.call(rbind, strsplit(as.vector(gsub("[()]", "", bike_parking$Geom)), split = ",")))

我只剩下 3033。这是怎么发生的,我应该采取什么步骤来找出问题所在?

> head(dat)
             X1              X2
1 37.7606289177  -122.410647009
2  37.752476948  -122.410625009
3 37.7871729481  -122.402401009
4 37.7776039475  -122.422764009
5 37.7658325695   -122.46649784
6 37.7693399479  -122.432820008

> nrow(dat)
[1] 3033

【问题讨论】:

  • 我很确定这不是问题,但可能是一个元素不包含逗号,
  • 也许可以,但我如何检查它以及它发生在哪里?
  • 使用grep(",", bike_parking$geom)
  • 产生:grep(",", bike_parking$geom) integer(0)
  • $Geom$geom? grep(",", bike_parking$Geom, invert=TRUE) 返回什么?

标签: r dplyr gsub strsplit


【解决方案1】:

似乎您的字符串在所有地方都没有相同的结构。您必须以某种方式知道它们都具有哪种结构才能正确拆分它们。从问题下方的 cmets 中,我得出某些字符串可能不包含逗号来分割坐标。您可以删除所有逗号并在空白处拆分字符串。我将在 base R 中发布一个解决方案,并在 stringr-package 中发布一个解决方案。

选项 1:基础 R: 我们可以使用gsub() 删除字符串中的括号和逗号。然后我们可以使用strsplit() 在空格处拆分字符串。结果将是:

splitted <- strsplit(gsub("[(),]", "", bike_parking$Geom), " ")
# [[1]]
# [1] "37.7606289177"  "-122.410647009"
# [[2]]
# [1] "37.752476948"   "-122.410625009"
# [[3]]
# [1] "37.7871729481"  "-122.402401009"
# [[4]]
# [1] "37.7776039475"  "-122.422764009"
# [[5]]
# [1] "37.7658325695" "-122.46649784"
# [[6]]
# [1] "37.7693399479"  "-122.432820008"

我们必须稍微重新组织一下这些结果,所以你最终会得到一个包含两列的 data.frame:

sapply(1:2, function(x) sapply(splitted, `[[`, x))
#      [,1]            [,2]            
# [1,] "37.7606289177" "-122.410647009"
# [2,] "37.752476948"  "-122.410625009"
# [3,] "37.7871729481" "-122.402401009"
# [4,] "37.7776039475" "-122.422764009"
# [5,] "37.7658325695" "-122.46649784" 
# [6,] "37.7693399479" "-122.432820008"

选项 2:Stringr: 这个包包含一个函数 str_split()不是 strsplit()!),它允许您跳过基础 R 中的最后一步解决方案,因为您可以立即获得 data.frame 而不是带有向量的列表:

str_split(gsub("[(),]", "", bike_parking$Geom), " ", simplify=TRUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多