更改数据格式

时间:2016-06-18 10:52:15

标签: r formatting dataset

我收到了要分析的数据集,第一行是:

day;lang;nil;longitude;latitude
0;it;5;918.926.528;4.545.545.373
0;ar;28;92.235.078;4.545.206.021
0;es;65;91.225.254;45.497.917
0;it;21;921.481.788;4.547.046.575
0;it;50;915.995;45.450.124
0;ar;28;922.355.903;4.545.202.558
0;ar;28;922.362.504;454.523.043
0;ar;28;922.318.987;4.545.211.746

问题如下:经度和纬度的列格式不是很好,因为我知道这些数据取自何处,经度应该是" 9,..."和纬度应该是" 45,...."

正如您所看到的,每个经度和纬度记录中的位数也不同!

有关如何解决此问题的想法(可能在 R 中)?

2 个答案:

答案 0 :(得分:3)

如果你对这些数据感到“困惑”,那么这可能会有所帮助:

library(dplyr)

df <- read.table(text="day;lang;nil;longitude;latitude
0;it;5;918.926.528;4.545.545.373
0;ar;28;92.235.078;4.545.206.021
0;es;65;91.225.254;45.497.917
0;it;21;921.481.788;4.547.046.575
0;it;50;915.995;45.450.124
0;ar;28;922.355.903;4.545.202.558
0;ar;28;922.362.504;454.523.043
0;ar;28;922.318.987;4.545.211.746", 
           header=TRUE, sep=";", stringsAsFactors=FALSE)

cleanup <- function(x, n) {
  x <- gsub("\\.", "", x)
  x <- sub(sprintf("^%s", n), sprintf("%s\\.", n), x)
  as.numeric(x)
}

df %>% 
  mutate(longitude=cleanup(longitude, 9),
         latitude=cleanup(latitude, 45))

##   day lang nil longitude latitude
## 1   0   it   5  9.189265 45.45545
## 2   0   ar  28  9.223508 45.45206
## 3   0   es  65  9.122525 45.49792
## 4   0   it  21  9.214818 45.47047
## 5   0   it  50  9.159950 45.45012
## 6   0   ar  28  9.223559 45.45203
## 7   0   ar  28  9.223625 45.45230
## 8   0   ar  28  9.223190 45.45212

答案 1 :(得分:0)

使用base R:

可以做到这一点
sep <- "."

# remove dots from latitude and longitude
dt$latitude <- gsub("\\.","",dt$latitude)
dt$longitude <- gsub("\\.","",dt$longitude)

# insert your sep at your desired position
dt$longitude <- as.numeric(paste0(substring(dt$longitude,1,1), sep, substring(dt$longitude,2)))
dt$latitude <- as.numeric(paste0(substring(dt$latitude,1,2), sep, substring(dt$latitude,3)))

  # day lang nil longitude latitude
# 1   0   it   5  9.189265 45.45545
# 2   0   ar  28  9.223508 45.45206
# 3   0   es  65  9.122525 45.49792
# 4   0   it  21  9.214818 45.47047
# 5   0   it  50  9.159950 45.45012
# 6   0   ar  28  9.223559 45.45203
# 7   0   ar  28  9.223625 45.45230
# 8   0   ar  28  9.223190 45.45212

数据

dt <- read.table(text = "day;lang;nil;longitude;latitude
    0;it;5;918.926.528;4.545.545.373
                  0;ar;28;92.235.078;4.545.206.021
                  0;es;65;91.225.254;45.497.917
                  0;it;21;921.481.788;4.547.046.575
                  0;it;50;915.995;45.450.124
                  0;ar;28;922.355.903;4.545.202.558
                  0;ar;28;922.362.504;454.523.043
                  0;ar;28;922.318.987;4.545.211.746", header=T,sep=";")