我没有运气地孜孜不倦地寻找这个。我来自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
我会在这方面给你提供帮助。感谢
答案 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]))