在我的数据框中,我有一个字符列。我想使用自己编写的函数从现有字符列创建一个新列。
我的功能
lat_finder <- function(coord){
return(as.numeric(substr(strsplit(coord,",")[[1]][1],2,10)))}
测试数据框
test <- data.frame('loc' = c("(37.7862913318072, -122.401375181471)","(37.7646938184545, -122.449439257453)","(37.7860078381928, -122.430650176965)"))
我正在尝试
test['Lat'] <- lapply(test['loc'],lat_finder)
结果是一个新列,但仅包含第一行的功能结果,即第一纬度应为37.786 ...,这是新列中每一行的值。我知道for循环会像我之前做的那样工作,但是要花很多时间,所以我真的想加快速度。我敢肯定,很明显我在这里缺少了一些东西,因此,除了一个修复程序之外,我还希望对我的代码按原样进行的解释表示感谢。
初步说明-由于您对data.frame的调用缺少stringsAsFactors = FALSE,因此您正在将输入字符串转换为一个因数,这使得问题在您陈述时不再重复。就是说,我认为这可能只是测试代码中的问题,而不是实际问题的根源,我将其添加到这里:
test_f <- data.frame('loc' = c("(37.7862913318072, -122.401375181471)",
"(37.7646938184545, -122.449439257453)",
"(37.7860078381928, -122.430650176965)"),
stringsAsFactors = FALSE)
话虽如此,您的根本问题是提取列“ loc”的方式。这个方括号,字符串名选择拉出一个单列数据框:
> your_pull <- test_f['loc']
> your_pull
loc
1 (37.7862913318072, -122.401375181471)
2 (37.7646938184545, -122.449439257453)
3 (37.7860078381928, -122.430650176965)
> typeof(your_pull)
[1] "list"
> class(your_pull)
[1] "data.frame"
lapply
期望向量作为输入,您可以使用经典$
记号获得:
> dollar_pull <- test_f$loc
> dollar_pull
[1] "(37.7862913318072, -122.401375181471)" "(37.7646938184545, -122.449439257453)"
[3] "(37.7860078381928, -122.430650176965)"
> typeof(dollar_pull)
[1] "character"
> class(dollar_pull)
[1] "character"
该函数调用现在可以正常工作(预期您会得到一个可能需要向量的列表-请参阅下面的附带说明):
> lapply(test_f$loc,lat_finder)
[[1]]
[1] 37.78629
[[2]]
[1] 37.76469
[[3]]
[1] 37.78601
附带的几点:
1)将新列$
也指定为一个好主意。
2)您可能想要使用sapply或vapply,这将产生一个向量,而不是新data.frame列的列表。
3)您可能想放弃Hadley Wickham的purr申请家庭。供参考,这里的电话是purrr::map_chr(test_f$loc, you_function)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句