【问题标题】:Converting a column string to numeric in an r data frame将列字符串转换为 r 数据框中的数字
【发布时间】:2019-07-04 04:54:30
【问题描述】:

我有一个数据框,其中有一列字符串如下:

    mydata <- c("-1.356670,35.355030",
            "-1.356670,35.355030", 
            "-1.356620,35.355890", 
            "-1.356930,35.358660", 
            "-1.357000,35.359060"
    )

    df <- data.frame(mydata)

我想将其转换为包含两列“longlat 的数据框,每个都是数字类型。最好的方法是什么?我尝试使用 lapply,但不能似乎让它工作。

【问题讨论】:

  • 你提供的例子不是数据框,而是向量。
  • 就是这样。我会更新的。

标签: r dataframe tuples


【解决方案1】:

使用基础 R,您可以:

df$Long <- as.numeric(sapply(strsplit(as.character(df$mydata), ","), function(x) x[1]))
df$Lat <- as.numeric(sapply(strsplit(as.character(df$mydata), ","), function(x) x[2]))

               mydata     Long      Lat
1 -1.356670,35.355030 -1.35667 35.35503
2 -1.356670,35.355030 -1.35667 35.35503
3 -1.356620,35.355890 -1.35662 35.35589
4 -1.356930,35.358660 -1.35693 35.35866
5 -1.357000,35.359060 -1.35700 35.35906

或与tstrsplit() 来自data.table

df$Long <- as.numeric(tstrsplit(df$mydata, ",")[[1]])
df$Lat <- as.numeric(tstrsplit(df$mydata, ",")[[2]])

还有@clmarquart 提议的data.table 中的tstrsplit()

setDT(df)[, c("lat", "long") := tstrsplit(mydata, ",", fixed = TRUE)]

【讨论】:

  • 如果您有兴趣,可以将它们组合成一个电话:matrix(as.numeric(unlist(lapply(df$mydata, strsplit, split=","))), byrow=T, nrow=2)
  • 或者如果你确实使用data.table,如果你先创建一个data.tabledt = data.table(df)),那么你也可以这样做:dt[, c('lat','long') := tstrsplit(mydata, ",", fixed=T)][]
  • @clmarquart 感谢您的发言。我喜欢你data.table 的可能性,所以我将它添加到我的帖子中。
【解决方案2】:

这可以在base R中的一行中完成:

read.table(text = as.character(df$mydata), sep = ",", col.names = c("long", "lat"))

给予:

     long      lat
1 -1.35667 35.35503
2 -1.35667 35.35503
3 -1.35662 35.35589
4 -1.35693 35.35866
5 -1.35700 35.35906

【讨论】:

    【解决方案3】:

    tidyverse 解决方案。

    library(tidyverse)
    
    dat <- df %>%
      separate(mydata, into = c("Long", "Lat"), sep = ",", convert = TRUE)
    
    # Print the data
    dat
    #       Long      Lat
    # 1 -1.35667 35.35503
    # 2 -1.35667 35.35503
    # 3 -1.35662 35.35589
    # 4 -1.35693 35.35866
    # 5 -1.35700 35.35906
    

    【讨论】:

      【解决方案4】:

      使用strsplitdo.call,那么我们只需要指定列名

      newdf=do.call(rbind.data.frame, strsplit(mydata,','))
      names(newdf)=c('long','lat')
      newdf
             long       lat
      1 -1.356670 35.355030
      2 -1.356670 35.355030
      3 -1.356620 35.355890
      4 -1.356930 35.358660
      5 -1.357000 35.359060
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-17
        • 2017-04-25
        • 2022-08-12
        • 2019-04-28
        • 2020-09-21
        • 2018-04-08
        • 2013-06-04
        相关资源
        最近更新 更多