2016-11-02 7 views
0

他の人がこの課題にどのように対処するかを知りたい。行にデータがあるときに長い列と重複する列

背景

データは、植生モニタリングのためです。これは、プロットの基本情報を含み、その種の種およびその%カバーを識別します。

プロット固有の情報には、日付、位置、距離、種別の行がいくつかあります。種の列の値には、列によって表されるプロット内の種の%カバーが含まれます。

簡略図は、このようなグリッドのようになります。

plot  1   4   5 
date  5/3/2016  6/20/2016  6/22/2016 
location A   F    K 
sp1     15   30 
sp2   5      100 
sp3   T   3    5 

私は何をし得ることを期待すると、データベース(種%カバーにCSVインポートに適しています。このようなグリッドはへの参照を必要としていますプロット情報はRMDBにあります)。 一番左の列=テーブルのフィールド名。

plot  1  1   4  4   5   5  5 
date  5/3/2016 5/3/2016 6/20/2016 6/20/2016 6/22/2016 6/22/2016 6/22/2016 
location A  A   F  F   K   K  K 
species sp2  sp3  sp1  sp3  sp1  sp2  sp3 
cover %  5  T   15  3   30  100  5 

このワイドフォーマットは、容易にデータベースによって「消化」と適切に二つのテーブル(プロット& CoverPercent)を移入することができます。

アプローチ?

私はいくつかのアプローチについて考えましたが、私は欠けているよりよい方法があると思います。ここで

は、私がこれまでに作ってみたものです:

  • フリップは広い

  • まで長いからのデータは、種の数をカウントしspeciescover

  • を追加します。与えられたプロットについて

  • speciの数に基づいてプロットの列を繰り返しますES

もともと私はVBAでこれを行うことができると思っていたが、おそらくRがより良い/速い/クリーナーアプローチであると思われるプロットの「種」と「カバー」の行を読み込みます。質問は "どのように"ですか?

私は最近、テーブルパッケージでいくつかのR作業を行ってきましたが、私はVBA/SQLプロジェクトで過去1年間を費やしていました。

私はこの変化に他人がどのように近づくのか不思議です。何かご意見は?

+1

データベースが本当にそのような転置csvファイルを使用するか、または「ワイドの左側の列ラベルですん"本当にヘッダーの例ですか? – Comintern

+0

あなたはそうです - それらは左側の見出しです(列名)。私はこのデータをあまりにも長く見てきたと思います! – NWdev

+0

現在、データは「簡易表示」のように見えるか、どこか他の場所から来るExcelシートにありますか? VBAソリューションは本当に簡単でしょう - 私はRと話すことができません – Comintern

答えて

1

私はこれにOOのアプローチを使用したいと思います。

'Also in Plot.cls 
Public Property Get CsvRows() As String 
    Dim key As Variant 
    Dim output() As String 
    ReDim output(mCover.Count - 1) 
    Dim i As Long 
    For Each key In mCover.Keys 
     Dim temp(4) As String 
     temp(0) = this.PlotId 
     temp(1) = this.DataDate 
     temp(2) = this.Location 
     temp(3) = key 
     temp(4) = mCover(key) 
     output(i) = Join(temp, ",") 
     i = i + 1 
    Next key 
    CsvRows = Join(output, vbCrLf) 
End Property 
:そして、それをCSVデータ行のリストを出してくれる性質を与える

'Plot.cls 
Option Explicit 

Private Type PlotMembers 
    PlotId As Long 
    DataDate As Date 
    Location As String 
End Type 

Private this As PlotMembers 
Private mCover As Scripting.Dictionary 

Private Sub Class_Initialize() 
    Set mCover = New Scripting.Dictionary 
End Sub 

Public Property Get PlotId() As Long 
    PlotId = this.PlotId 
End Property 

Public Property Let PlotId(inValue As Long) 
    this.PlotId = inValue 
End Property 

Public Property Get DataDate() As Date 
    DataDate = this.DataDate 
End Property 

Public Property Let DataDate(inValue As Date) 
    this.DataDate = inValue 
End Property 

Public Property Get Location() As String 
    Location = this.Location 
End Property 

Public Property Let Location(inValue As String) 
    this.Location = inValue 
End Property 

Public Sub AddSpeciesCover(species As String, cover As String) 
    mCover.Add species, cover 
End Sub 

:プロットやデータに関する情報を保持し、生物種やカバレッジ比率の辞書を持っている単純なクラスを定義します。

次に入力データから入力するだけです。ここでのサンプルの使用方法では、質問のトップグリッドは、基本的にA1の左上隅を持つアクティブなシートのように見えることに注意してください。このあなたがデータを収集する必要があるかと一致するように変更することが非常に容易でなければなりません。これが唯一の方法の要点を実証するためのスケルトンであることを

Public Sub SampleUsage() 
    Dim plots As New Collection 

    With ActiveSheet 
     Dim col As Long 
     For col = 2 To 4 
      Dim current As Plot 
      Set current = New Plot 
      current.PlotId = .Cells(1, col).Value 
      current.DataDate = .Cells(2, col).Value 
      current.Location = .Cells(3, col).Value 
      Dim r As Long 
      For r = 4 To 6 
       Dim cover As String 
       cover = .Cells(r, col).Value 
       If cover <> vbNullString Then 
        current.AddSpeciesCover .Cells(r, 1).Value, cover 
       End If 
      Next 
      plots.Add current 
     Next 

    End With 

    For Each current In plots 
     Debug.Print current.CsvRows 
    Next 
End Sub 

注意を - それはエラー処理を必要とする、より堅牢なフォーマット、生産準備が整っていることなどが挙げられます。

1

reshape2パッケージのmelt()メソッドを使用して、Rでデータフレームの形状を変更するだけです。以下はコメントで言及しているようだとして、あなたのポストされたデータの転置ビューは実際の形式である前提としています

library(reshape2) 

data = 'plot date location sp1 sp2 sp3 
1 5/3/2016 A  5 T 
4 6/20/2016 F 15  3 
5 6/22/2016 K 30 100 5' 

df <- read.table(text=data, header=TRUE, sep="\t", stringsAsFactors = FALSE) 
df  
# plot  date location sp1 sp2 sp3 
# 1 1 5/3/2016  A NA 5 T 
# 2 4 6/20/2016  F 15 NA 3 
# 3 5 6/22/2016  K 30 100 5 

mdf <- melt(df, id.vars=c("plot", "date", "location"), 
      variable.name="species", na.rm = TRUE, value.name="cover %") 
mdf <- mdf[with(mdf, order(date)),]    # ORDER BY DATE 
rownames(mdf) <- seq_len(nrow(mdf))    # RESET ROW NAMES 
mdf 

# plot  date location species cover % 
# 1 1 5/3/2016  A  sp2  5 
# 2 1 5/3/2016  A  sp3  T 
# 3 4 6/20/2016  F  sp1  15 
# 4 4 6/20/2016  F  sp3  3 
# 5 5 6/22/2016  K  sp1  30 
# 6 5 6/22/2016  K  sp2  100 
# 7 5 6/22/2016  K  sp3  5 
関連する問題