2017-12-18 28 views
1

私はプロジェクトのデータ入力を行うためにExcelの悪夢を作成しました。私は合計20のタブを持つ2つのスプレッドシートを持っています。データ構造は各タブで同じです。私は、希望の構造にマージされたスプレッドシートの1つのタブのデータからCSVファイルを作成し、Rデータフレームにインポートしてから意味のある形式に再構成することができます。列内のすべてのデータを1つの列に移動する(マージしない)ようにして、Rの新しい列に分割する方法は?

各タブには、約120列(サンプリング日数によって異なる)と100行(観察された種の数によって異なる)があります。各列は植物の種であり、各列には特定の日付と特定の場所のデータが含まれています。

私の(サンプルデータ)を5行(列と列)のデータフレームを25行の単一の列に変換したいと思います。

次に、各行(レコード:「08/10/2017,2から3、Solidago virgaurea ssp。alpestris、V、vt」のレコード)からデータを取り出して、次の列に変換します:

日、セグメント種、コード1、コード2、...

種に対するセグメントにおける日の各観測が1と7つの異なるコード間含んでいるので、それぞれの列の数4〜10列のレコードが生成されます。結果は上記の構造に従うことに注意してください。各観測は引用符で囲まれており、データはコンマで区切られています。

ありがとうございました!

test <- structure(list(V120 = c("03/10/2017,3 to 4,Salix phylicifolia,Y", 
"03/10/2017,3 to 4,Saussurea alpina,Y", "03/10/2017,3 to 4,Silene dioica,Y", 
"03/10/2017,3 to 4,Solidago virgaurea ssp. alpestris,Y", "03/10/2017,3 to 4,Sorbus aucuparia ssp. glabrata,Y"), V121 = c("03/10/2017,4 to 5,Salix phylicifolia,C,0,g1,L3", "03/10/2017,4 to 5,Saussurea alpina,Y", "03/10/2017,4 to 5,Silene dioica,Y", "03/10/2017,4 to 5,Solidago virgaurea ssp. alpestris,Y", "03/10/2017,4 to 5,Sorbus aucuparia ssp. glabrata,Y"), V122 = c("08/10/2017,1 to 2,Salix phylicifolia,Vb,L4", "08/10/2017,1 to 2,Saussurea alpina,uf,V,vt", "08/10/2017,1 to 2,Silene dioica,Vb,vt", "08/10/2017,1 to 2,Solidago virgaurea ssp. alpestris,V,vt", "08/10/2017,1 to 2,Sorbus aucuparia ssp. glabrata,L4"), V123 = c("08/10/2017,2 to 3,Salix phylicifolia,L4", "08/10/2017,2 to 3,Saussurea alpina,uf,V,vt", "08/10/2017,2 to 3,Silene dioica,vt", "08/10/2017,2 to 3,Solidago virgaurea ssp. alpestris,V,vt", "08/10/2017,2 to 3,Sorbus aucuparia ssp. glabrata,Y"), V124 = c("08/10/2017,3 to 4,Salix phylicifolia,Y", "08/10/2017,3 to 4,Saussurea alpina,Y", "08/10/2017,3 to 4,Silene dioica,Y", "08/10/2017,3 to 4,Solidago virgaurea ssp. alpestris,Y", "08/10/2017,3 to 4,Sorbus aucuparia ssp. glabrata,Y")), .Names = c("V120", "V121", "V122", "V123", "V124"), row.names = 41:45, class = "data.frame") 
+1

ナイトメア? Excelユーザーは、その単語をより頻繁に使用する必要があります(upvote)。 –

答えて

1

私は基本Rからstackと一緒に、私の "splitstackshape" パッケージからcSplitをお勧めしたい:

library(splitstackshape) 
head(cSplit(stack(test), "values", ",")) 
#  ind values_1 values_2       values_3 values_4 values_5 values_6 values_7 
# 1: V120 03/10/2017 3 to 4    Salix phylicifolia  Y  NA  NA  NA 
# 2: V120 03/10/2017 3 to 4     Saussurea alpina  Y  NA  NA  NA 
# 3: V120 03/10/2017 3 to 4      Silene dioica  Y  NA  NA  NA 
# 4: V120 03/10/2017 3 to 4 Solidago virgaurea ssp. alpestris  Y  NA  NA  NA 
# 5: V120 03/10/2017 3 to 4 Sorbus aucuparia ssp. glabrata  Y  NA  NA  NA 
# 6: V121 03/10/2017 4 to 5    Salix phylicifolia  C  0  g1  L3 

それとも、このように、まっすぐな "data.table" を使用することができます

library(tidyverse) 
test %>% 
    gather(var, val, everything()) %>% 
    separate(val, into = c("Date", "Segment", "Species", paste("Code", 1:7, sep = "_")), sep = ",") %>% 
    head() 
# var  Date Segment       Species Code_1 Code_2 Code_3 Code_4 Code_5 
# 1 V120 03/10/2017 3 to 4    Salix phylicifolia  Y <NA> <NA> <NA> <NA> 
# 2 V120 03/10/2017 3 to 4     Saussurea alpina  Y <NA> <NA> <NA> <NA> 
# 3 V120 03/10/2017 3 to 4      Silene dioica  Y <NA> <NA> <NA> <NA> 
# 4 V120 03/10/2017 3 to 4 Solidago virgaurea ssp. alpestris  Y <NA> <NA> <NA> <NA> 
# 5 V120 03/10/2017 3 to 4 Sorbus aucuparia ssp. glabrata  Y <NA> <NA> <NA> <NA> 
# 6 V121 03/10/2017 4 to 5    Salix phylicifolia  C  0  g1  L3 <NA> 
# Code_6 Code_7 
# 1 <NA> <NA> 
# 2 <NA> <NA> 
# 3 <NA> <NA> 
# 4 <NA> <NA> 
# 5 <NA> <NA> 
# 6 <NA> <NA> 
:あなたは "tidyverse" を希望する場合
library(data.table) 
head(setDT(test)[, list(var = unlist(.SD))][, tstrsplit(var, ",")]) 
#   V1  V2        V3 V4 V5 V6 V7 
# 1: 03/10/2017 3 to 4    Salix phylicifolia Y NA NA NA 
# 2: 03/10/2017 3 to 4     Saussurea alpina Y NA NA NA 
# 3: 03/10/2017 3 to 4      Silene dioica Y NA NA NA 
# 4: 03/10/2017 3 to 4 Solidago virgaurea ssp. alpestris Y NA NA NA 
# 5: 03/10/2017 3 to 4 Sorbus aucuparia ssp. glabrata Y NA NA NA 
# 6: 03/10/2017 4 to 5    Salix phylicifolia C 0 g1 L3 

、あなたのような何かを試すことができます

"tidyverse"の解決方法は、最終的にいくつの列があるかを知ることによって決まります。

明らかに、あなたの実際のデータと、これらのオプションのいずれかからhead()を削除...

+1

あなたの 'data.table'ソリューションは、エレガントで簡単です!これは私のExcelの悪夢を耐え難いものにしました。ありがとうございました! –

関連する問題