【问题标题】:How to create a new column using function in R?如何使用 R 中的函数创建新列?
【发布时间】:2019-02-21 14:07:24
【问题描述】:

我有一个包含地理位置的数据框。位置是字符串。 这是我抓取字符串并通过 Degress.Decimal 获取位置的函数。

示例位置 23º 30.0'N

 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)
  }

结果> 23.5

然后我想在我的原始数据框中创建一个新列,将函数应用于纬度列中的每个项目。 经度也是同样的问题。另一个新专栏

我知道如何使用 Python 和 Pandas 购买我是新手 y R 并且找不到解决方案。

我正在尝试

lapply(datos$Latitude, 2 , FUN= latitud.decimal(y)) 

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

【问题讨论】:

  • 试试sapply(datos$Latitude, latitud.decimal)
  • 您的函数看起来非常接近矢量化。如果您发布一些示例数据(向量中的一些值),我们可以帮助完成向量化,这意味着您只需执行latitude.decimal(datos$Latitude)

标签: r


【解决方案1】:

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

为了回答这个问题,我缺乏可重现的示例和数据。 This page 描述了如何提出更有可能重现的问题,从而获得更好的答案。 由于我缺乏数据和代码,我无法测试我是否真的做到了,但无论如何我都会试一试。

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

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 包进行分配的示例,请参见 this stackoverflow 页面。

在基础 R 中,我们只需将操作执行为

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

【讨论】:

    【解决方案2】:
    datos$lat_decimal = sapply(datos$Latitude, latitud.decimal)
    

    【讨论】:

    • @Clemsang ...不知道你的意思是什么。如果此答案提供了更多解释,那就太好了——如果您正在研究的答案可以在您的评论中对解决方案提供更多解释,请发布它,它可能会被赞成。但总的来说,不鼓励评论而不是回答。答案属于答案,而不是 cmets。评论是为了寻求澄清、简单讨论切线相关的位等。
    • 我在这里没有看到比我的评论更多的解释。了解我可能会回答而不是评论的事实。
    • 对。仍然不明白你在这里评论@Clemsang 的目的。
    • 使用函数将“23º30`N”转换为23.5
    猜你喜欢
    • 2021-12-12
    • 2013-09-15
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多