【问题标题】:read data set in r and change the format读取 r 中的数据集并更改格式
【发布时间】:2013-11-17 03:24:34
【问题描述】:

我有一个美国降水数据集。它有纬度、经度和降雨量。它具有以下格式:

       lon -124   -125  -126 -127 -128
   lat 45  120   110    NA   230  145
       44  NA    130    205  240  195
       43  120   110    NA   235  185
       42  170   140    204   NA  155

这是数据集的链接:

https://www.dropbox.com/s/1xxy2ospr9xvy8n/Pmaxupscaled.csv

我想用 R 把它转换成这种格式:

    precipitation  lat   lon       
    120            45    -124
    110            45    -125
    NA             45    -126

【问题讨论】:

  • @Ananda Mahto;它具有 .csv 格式。
  • @Ananda Mahto;我添加了 dput 格式。
  • dput 条目似乎不完整,它在我的最后不起作用。
  • @Ananda Mahto;我添加了数据集的链接。

标签: r reshape


【解决方案1】:

由于“reshape2”的答案已经超过了极限,这里是基础 R 中的一个选项:

a <- read.csv("path/to/Pmaxupscaled.csv", check.names = FALSE)
out <- cbind(lat = a[, 1], setNames(stack(a[-1]), c("precip", "lon")))
head(out)
#    lat precip  lon
# 1 45.0  77.63 -105
# 2 42.5  76.15 -105
# 3 40.0  72.18 -105
# 4 37.5  78.60 -105
# 5 35.0  80.93 -105
# 6 32.5  87.29 -105
tail(out)
#      lat precip lon
# 99  40.0 136.05 -75
# 100 37.5     NA -75
# 101 35.0     NA -75
# 102 32.5     NA -75
# 103 30.0     NA -75
# 104 27.5     NA -75

为了记录,这将是我使用“reshape2”的方法:

library(reshape2)
a <- read.csv("path/to/Pmaxupscaled.csv", check.names = FALSE)
names(a)[1] <- "lat"
out <- melt(a, id.vars="lat", value.name="precip", variable.name="lon")
head(out)
#    lat precip  lon
# 1 45.0  77.63 -105
# 2 42.5  76.15 -105
# 3 40.0  72.18 -105
# 4 37.5  78.60 -105
# 5 35.0  80.93 -105
# 6 32.5  87.29 -105

【讨论】:

  • 非常感谢。有用。能否请您告诉我如何删除具有“NA”值的那些行?
  • @user3000796,从“out out <- out[complete.cases(out),]应该这样做。
  • 阿南德太棒了。再次感谢。
【解决方案2】:

您可能需要使用“reshape2”包 -

library(reshape2)
df<- read.table(textConnection('
lat -124   -125  -126 -127 -128
45  120   110    NA   230  145
44  NA    130    205  240  195
43  120   110    NA   235  185
42  170   140    204   NA  155'), header = TRUE)

df2 <- melt(df, id.vars = 'lat')

您还需要为原始列名找到解决方法。 R 不喜欢数字列名。在这种特定情况下,这可能是一种解决方法 -

 df2$variable  <- gsub(x = df2$variable, pattern = "X\\.", replacement = "")

【讨论】:

  • @Cordoremifa;我使用了你的命令行,我把我的数据放在''中,因为这只是我数据的一部分,我运行它,我得到了这个错误:扫描错误(文件,什么,nmax,sep,dec,quote,skip,nlines , na.strings, : 第 1 行没有 2 个元素
  • 该错误消息似乎很清楚,您数据中的第 1 行具有不同数量的元素(列),而不是其他似乎有 2 个值的行。如果您查看我在“”中输入的内容,您会发现我没有完全复制粘贴您的数据。你需要做类似的事情。
  • 是的,我做了同样的事情。我用记事本复制然后粘贴到R中。然后变量之间没有空格我认为这就是原因。您如何复制和粘贴数据?
  • 让我从另一个方向来解决这个问题,您能将您的数据集转换为我开始使用的格式(手动或自动)吗?
【解决方案3】:

我不是超级 reshape2 用户,但这对我有用。

library(reshape2)
a <- read.csv("~/Documents/Pmaxupscaled.csv")

# Convert to matrix
a <- as.matrix(a)

# Replace row names with the values from the first column
dimnames(a)[[1]] <- a[, 1]

# Drop the first column
a <- a[, -1]

# Melt the matrix into a data frame.
b <- melt(a, varnames = c("Lat", "Lon"))

# Get rid of "X."
b$Lon <- gsub("X\\.", "", b$Lon)

# Format longitude as negative number
b$Lon <- as.numeric(b$Lon)
b$Lon <- -1 * b$Lon

# Rename precipitation column
names(b)[3] <- "precipitation"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2015-08-28
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多