数据帧

时间:2017-06-27 21:36:05

标签: r string string-matching

我没有运气地孜孜不倦地寻找这个。我来自Java背景,是R的新手。(另一方面,我很喜欢R,但不喜欢它中的字符串操作以及文档 - 可能这只是Java偏见。)

无论如何,我有一个带有单列的数据帧,它由一个由冒号分隔的纬度和经度数字组成,例如的 ROAD:_: - 87.4968190989999:38.7414455360001

我想创建2个新数据框,每个数据框都有单独的纬度和长数。

我已经成功编写了一段代码,用于循环(但我知道这是低效的 - 并且必须采用另一种方式)

以下是低效代码的片段:

length <- length(fromLatLong)

for (i in 1:length){
      fromLat[i] <- strsplit(fromLatLong[i] ,":")[[1]][4]

    }

    for (i in 1:length){
      fromLong[i] <- strsplit(fromLatLong[i] ,":")[[1]][3]

    }

    for (i in 1:length){
      toLat[i] <- strsplit(toLatLong[i] ,":")[[1]][4]

    }

    for (i in 1:length){
      toLong[i] <- strsplit(toLatLong[i] ,":")[[1]][3]

    }

以下是我尝试使用mutate优化它的方法,但我只将第一个值复制到所有行中:

fromLat = mutate(fromLatLong, FROM_NODE_ID = (strsplit(as.character(fromLatLong$FROM_NODE_ID),":")[[1]][4]))
fromLong = mutate(fromLatLong, FROM_NODE_ID = (strsplit(fromLatLong$FROM_NODE_ID,":")[[1]][3]))
toLat = mutate(toLatLong, TO_NODE_ID = (strsplit(toLatLong$TO_NODE_ID,":")[[1]][4]))
toLong = mutate(toLatLong, TO_NODE_ID = (strsplit(toLatLong$TO_NODE_ID,":")[[1]][3]))

结果如下:

FROM_NODE_ID

    1
38.7414455360001
2
38.7414455360001
3
38.7414455360001
4
38.7414455360001
5
38.7414455360001
6
38.7414455360001
7
38.7414455360001
8
38.7414455360001
9
38.7414455360001

我会在这方面给你提供帮助。感谢

2 个答案:

答案 0 :(得分:0)

以下表达式将生成一个数据框,每个冒号分隔的组件都作为单独的列。然后,您可以将其分解为单独的数据框,或者使用它来执行任何其他操作。

as.data.frame(t(matrix(unlist(strsplit(fromLatLong$coords, ":", fixed=TRUE), recursive=FALSE), nrow=4)),stringsAsFactors=FALSE)

(假设数据框中值的列名为coords。)

答案 1 :(得分:0)

您可以使用map_chr包的purrr功能。例如:

fromLat = mutate(fromLatLong, FROM_NODE_ID = map_chr(FROM_NODE_ID, ~ strsplit(as.character(.x),":")[[1]][4]))