2017-06-27 35 views
1

我已经找到了这个不知疲倦,没有运气。我来自Java背景,并且是R的新手。(在附注中,我喜欢R,但不喜欢其中的字符串操作以及文档 - 也许这只是Java偏差)。整个数据帧列中的子串(可变长度)值

无论如何,我具有单列数据框,它由经冒号分隔的纬度和经度数字组成,例如, 道:_: - 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] 

    } 

这里是我试图用突变成优化它,但我只得到复制到所有行这样的第一个值:

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

从包* tidyr *中分离出来的东西可能在这里很有用。 – aosmith

回答

0

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

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

谢谢,这工作。但你能简单解释一下吗?什么“〜”意味着什么? “.x”来自哪里以及如何理解该参考?我也看了一下map()文档,并不明白这是如何实际解决问题的。 –

+0

这种方法是有效的,因为'map_chr'作为输入列表或向量并返回一个字符向量。公式(“〜”)是创建匿名函数的简写,“.x”是自变量。例如,在'map'中使用'〜.x + 1'时,这相当于'function(x)x + 1'。 你的解决方案的问题是'strsplit(as.character(fromLatLong $ FROM_NODE_ID),“:”)'创建一个拆分字符串列表。在你的情况下,你每次选择包含在列表第一个元素('[[1]]')中的矢量的第四个元素('[4]')。 – amarchin

0

下面的表达式将生成一个数据框,每个冒号分隔的组件作为一个单独的列。然后,您可以将其分解为单独的数据框架或执行您想要的任何其他功能。

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

(在数据帧的假设值的列名是coords。)