【问题标题】:reading data from CSV and reshape it in r从 CSV 读取数据并在 r 中对其进行整形
【发布时间】:2013-10-14 17:41:41
【问题描述】:

我每个月都有从 1980 年到 2004 年的数据集(下面给出了其中的一部分),但我不知道如何从 CSV 读取它并将其转换为具有以下形式的矩阵:data[lat,lon ,time] 其中时间从1开始到(2004-1980)*12

...

【问题讨论】:

  • 请提供minimal, reproducible data set(即不是屏幕转储)以及您尝试过的代码。谢谢!
  • @Henrik : 数据可在此处下载:ulmo.ucmerced.edu/w_FireData.html 文件名为 FedFire8004.zip
  • @Ananda Mahto:再问一个问题。是否可以转换这些文件:例如“英亩”从其原始格式转换为 netcdf 格式?
  • @user2607526,对不起,我对netcdf格式不太了解。有处理格式的包,但我从未使用过它们。这本身可能是一个新问题。
  • @Ananda Mahto:我不知道如何感谢您的帮助。再次感谢。

标签: r csv reshape


【解决方案1】:

数据已经存在于.rda 数据文件中,因此读取它很容易。从干净的工作区开始,执行以下操作:

load("fedfire8004.rda")
ls()                  ## What objects were read in?
# [1] "fedfire8004"
str(fedfire8004)      ## What does that object look like?
# List of 10
# $ lon  : num [1:24] -124 -124 -122 -122 -120 ...
# $ lat  : num [1:18] 31.5 32.5 33.5 34.5 35.5 36.5 37.5 38.5 39.5 40.5 ...
# $ x    : num [1:25] -125 -124 -123 -122 -121 -120 -119 -118 -117 -116 ...
# $ y    : num [1:19] 31 32 33 34 35 36 37 38 39 40 ...
# $ year : int [1:300] 1980 1980 1980 1980 1980 1980 1980 1980 1980 1980 ...
# $ month: int [1:300] 1 2 3 4 5 6 7 8 9 10 ...
# $ acres: num [1:24, 1:18, 1:300] NA NA NA NA NA NA NA NA NA NA ...
# ..- attr(*, "dimnames")=List of 3
# .. ..$ lon  : chr [1:24] "-124.5" "-123.5" "-122.5" "-121.5" ...
# .. ..$ lat  : chr [1:18] "31.5" "32.5" "33.5" "34.5" ...
# .. ..$ month: chr [1:300] "1980.1" "1980.2" "1980.3" "1980.4" ...
# $ fires: num [1:24, 1:18, 1:300] NA NA NA NA NA NA NA NA NA NA ...
# ..- attr(*, "dimnames")=List of 3
# .. ..$ lon  : chr [1:24] "-124.5" "-123.5" "-122.5" "-121.5" ...
# .. ..$ lat  : chr [1:18] "31.5" "32.5" "33.5" "34.5" ...
# .. ..$ month: chr [1:300] "1980.1" "1980.2" "1980.3" "1980.4" ...
# $ meta : chr "USFS, NPS, BLM, BIA total fires and acres on 1 degree monthly grid 1980-2004"
# $ cite : chr "Westerling, A.L., T.J. Brown, A. Gershunov, D.R. Cayan and M.D. Dettinger, 2003: Climate and Wildfire in the Western United Sta"| __truncated__

如您所见,核心数据似乎是acresfires 列表项。将它们重塑为long 数据集可能更方便。最直接的方法可能是“reshape2”包中的melt

library(reshape2)
Acres <- melt(fedfire8004$acres)
Fires <- melt(fedfire8004$fires)

让我们查看每个新对象的前几行和最后几行。

head(Acres)
#      lon  lat  month value
# 1 -124.5 31.5 1980.1    NA
# 2 -123.5 31.5 1980.1    NA
# 3 -122.5 31.5 1980.1    NA
# 4 -121.5 31.5 1980.1    NA
# 5 -120.5 31.5 1980.1    NA
# 6 -119.5 31.5 1980.1    NA
tail(Acres)
#           lon  lat   month value
# 129595 -106.5 48.5 2004.12     0
# 129596 -105.5 48.5 2004.12     0
# 129597 -104.5 48.5 2004.12    71
# 129598 -103.5 48.5 2004.12    NA
# 129599 -102.5 48.5 2004.12    NA
# 129600 -101.5 48.5 2004.12    NA
head(Fires)
#      lon  lat  month value
# 1 -124.5 31.5 1980.1    NA
# 2 -123.5 31.5 1980.1    NA
# 3 -122.5 31.5 1980.1    NA
# 4 -121.5 31.5 1980.1    NA
# 5 -120.5 31.5 1980.1    NA
# 6 -119.5 31.5 1980.1    NA
tail(Fires)
#           lon  lat   month value
# 129595 -106.5 48.5 2004.12     0
# 129596 -105.5 48.5 2004.12     0
# 129597 -104.5 48.5 2004.12     2
# 129598 -103.5 48.5 2004.12    NA
# 129599 -102.5 48.5 2004.12    NA
# 129600 -101.5 48.5 2004.12    NA

【讨论】:

  • 这很棒。我不知道如何使用 .rda 文件。非常感谢。
  • @user2607526,没问题。 .rda 是用于指定 R 数据文件格式的常用扩展名之一。
【解决方案2】:

加载很简单

meaningful.name<-read.csv(file.choose(new = FALSE))
meaningful.name<-as.matrix(meaningful.name)
meaningful.name$time<-1:nrow(meaningful.name)

比我不知道你在追求什么,你能澄清一下吗?

【讨论】:

  • 我可以加载数据,但我不想保持原始格式。我希望它采用 latlontime 格式。
  • 好的。可能我没听懂你说的。让我先试试。谢谢
  • 对不起,我仍然对你想要做什么感到很困惑。您上面的数据在同一列上有 lat lon/month,仅低于它们 1:9,然后是三列,顶部为 31.5。 lat、lon 代表什么,其他三列代表什么,或者工作表是否继续?
  • @JoshGuilbert OP 在每个数据列的顶部都有一些数据(纬度/经度),而不是与数据值相关联。请参阅下面的答案,了解我认为正确的数据格式...
  • @beroe 和@Josh Guilbert:数据可在此处下载:ulmo.ucmerced.edu/w_FireData.html 文件名是 FedFire8004.zip,所以第一部分是 lat,第二部分是 lon,其余是数据1980 年到 2004 年为那个 lat-lon
【解决方案3】:

您应该(始终)尝试重新组织您的数据,以便每一列都包含一种类型的信息:

Year  Month  Lat  Lon  Value

python 脚本可能是执行此操作的最佳方式...一旦您拥有这种风格的脚本,就可以很容易地在 R 中导入和分析。

我制作了一个脚本,它将为您重新组织您的数据...但不清楚您是否可以轻松运行它。你用的是什么系统?

这是脚本...输出如下...

#!/usr/bin/env python
import csv

file_obj = open('originaldata.txt', 'r')
Input = csv.reader(file_obj, delimiter='\t')

LineNo = 0
year,month,data = [],[],[]
for items in Input:
    if LineNo == 0:
        lat = items[2:]
    elif LineNo == 1:
        lon = items[2:]
    else:
        year.append(items[0])
        month.append(items[1])
        data.append(items[2:])
    LineNo += 1

# print header
print "%s\t%s\t%s\t%s\t%s"% ("Year","Month","Lat","Lon","Data")
for La,Lo,Ind in zip(lat,lon,range(len(lat))):
    for Y,M,D in zip(year,month,data):
        print "%s\t%s\t%s\t%s\t%s"% (Y,M,La,Lo,D[Ind])

脚本的输出:

Year  Month  Lat     Lon    Data
1980    1   31.5    -111.5  0
1980    2   31.5    -111.5  0
1980    3   31.5    -111.5  0
1980    4   31.5    -111.5  0
1980    5   31.5    -111.5  8.1
1980    6   31.5    -111.5  5.1
1980    7   31.5    -111.5  0
1980    8   31.5    -111.5  0
1980    9   31.5    -111.5  0
1980    10  31.5    -111.5  0
1980    11  31.5    -111.5  0
1980    12  31.5    -111.5  0
1981    1   31.5    -111.5  0
1981    2   31.5    -111.5  0
1981    3   31.5    -111.5  0
1981    4   31.5    -111.5  0
1981    5   31.5    -111.5  0
1981    6   31.5    -111.5  0
1981    7   31.5    -111.5  0
1981    8   31.5    -111.5  0
1981    9   31.5    -111.5  0
1981    10  31.5    -111.5  0
1981    11  31.5    -111.5  0
1981    12  31.5    -111.5  0
1980    1   31.5    -110.5  0
1980    2   31.5    -110.5  0
1980    3   31.5    -110.5  0
1980    4   31.5    -110.5  881
1980    5   31.5    -110.5  794.1
1980    6   31.5    -110.5  644.4
1980    7   31.5    -110.5  85.2
1980    8   31.5    -110.5  0.1
1980    9   31.5    -110.5  0
1980    10  31.5    -110.5  0
1980    11  31.5    -110.5  0
1980    12  31.5    -110.5  0
1981    1   31.5    -110.5  0
1981    2   31.5    -110.5  0
1981    3   31.5    -110.5  0
1981    4   31.5    -110.5  0
1981    5   31.5    -110.5  0
1981    6   31.5    -110.5  0
1981    7   31.5    -110.5  0
1981    8   31.5    -110.5  0
1981    9   31.5    -110.5  0
1981    10  31.5    -110.5  0

【讨论】:

  • 我对 Python 不熟悉。用 Python 做这件事需要很多时间吗?因为我需要在这个星期三之前完成。
  • 好吧,如果是一次性交易,您可以复制粘贴……但考虑到数据集的大小,它可能会有点长。如果不清楚,我将编辑我的答案以显示我所设想的格式。
  • 是的,我可以复制粘贴,但如果没有其他更简单的方法,我想复制粘贴。
  • 在您的问题得到解决之前不要急于接受答案! ;^) 使用 windows 在 cmets 中解释起来有点困难,但可行。如果您想将原始数据文件发布到某个地方,我可以通过脚本运行它并重新发布新格式...
猜你喜欢
  • 2011-08-04
  • 2021-02-17
  • 2014-07-23
  • 2022-01-11
  • 2013-04-19
  • 1970-01-01
  • 2014-03-08
  • 2018-01-15
  • 2020-04-13
相关资源
最近更新 更多