如何使用R中的函数创建新列?

时间:2019-02-21 14:07:24

标签: r

我有一个带有地理位置的数据框。位置是字符串。 这是我的功能,可以抓取字符串并通过Degress.Decimal获取位置。

示例位置23º30.0'N

v

结果> 23.5

然后,我想在原始数据框中创建一个新列,将该功能应用于“纬度”列中的每个项目。 经度是否相同。另一个新列

我知道如何使用Python和Pandas来做到这一点,因为我是R的新手,却找不到解决方案。

我正在与

 latitud.decimal <- function(y) {
  latregex <- str_match(y,"(\\d+)º\\s(\\d*.\\d*).(.)")
  latitud <-  (as.numeric(latregex[1,2])) +((as.numeric(latregex[1,3])) / 60) 
  if (latregex[1,4]=="S") {latitud <-  -1*latitud}
  return(latitud)
  }

但不要读取每个列值的y“参数”。

2 个答案:

答案 0 :(得分:2)

请注意,str_match是矢量化的,如功能help("str_match")的帮助页面中所述。

为了回答这个问题,我缺乏可复制的示例和数据。 withUnsafeBufferPointer(_:)描述了人们如何提出更有可能被再现的问题,从而获得更好的答案。 由于我缺乏数据和代码,因此无法测试我是否真的在现场,但无论如何我都会试一试。

利用str_match被向量化的事实,我们可以不使用lapply来应用整个函数,从而简单地创建一个新列。我将略微重写您的函数,以合并向量化。请注意,1中缺少的latregex[., .]

latitud.decimal <- function(y) {
  latregex <- str_match(y,"(\\d+)º\\s(\\d*.\\d*).(.)")
  latitud <-  as.numeric(latregex[, 2]) + as.numeric(latregex[, 3]) / 60)
  which_south <- which(latregex[, 4] == "S") 
  latitud[which_south] <- -latitud[which_south]
  latitud
}

现在函数已准备就绪,可以使用$运算符来创建列。如果数据非常大,则可以使用data.table来更有效地执行。有关如何通过data.table包进行分配的示例,请参见init(cString:)页。

在基数R中,我们将简单地执行

datos$new_column <- latitud.decimal(datos$Latitude)

答案 1 :(得分:1)

datos$lat_decimal = sapply(datos$Latitude, latitud.decimal)