2017-08-26 2 views
0

私はデータフレームとして読み込んだ2つの.csvファイルを持っています。すべての年が1つの列に表示されるように2つのデータフレームを結合する

1) 

Tree1 var1 var2 var3 
Tree2 var1 var2 var3 


2) 

Tree1 year1 year2 year3 
Tree2 year1 year2 year3 

所望の出力:あなたが見ることができるように

3) 

Tree1 var1 var2 var3 year1 
Tree1 var1 var2 var3 year2 
Tree1 var1 var2 var3 year3 
Tree2 var1 var2 var3 year1 
Tree2 var1 var2 var3 year2 
Tree2 var1 var2 var3 year3 

、私は最初のデータフレームの行をコピーして、すべての年の1に表示されるように、第2データフレームの1年間だけ追加する必要がありますカラム。

答えて

4

最初にデータを読み込みます。下記のデータセットをあいまいなcol名で複製しました。

df1 <- data.frame(x1 = c("Tree1", "Tree2"), 
      x2 = c("var1", "var1"), 
      x3 = c("var2", "var2"), 
      x4 = c("var3", "var3")) 
df2 <- data.frame(x1 = c("Tree1", "Tree2"), 
      x2 = c("year1", "year1"), 
      x3 = c("year2", "year2"), 
      x4 = c("year3", "year3")) 

次に、tidyrパッケージを読み込みます。

install.packages('tidyr') 
library(tidyr) 

次に、2番目のデータセットを収集します。

df2 <- gather(df2, 
     key = "id", 
     value = "year", 
     -x1) 

最後に、2つのデータセットをマージします。

df <- merge(df2, df1, by = 'x1') 

必要に応じてidの列を削除します。出力は次のようになります

df$id <- NULL 

...

> df 
    x1 year x2 x3 x4 
1 Tree1 year1 var1 var2 var3 
2 Tree1 year2 var1 var2 var3 
3 Tree1 year3 var1 var2 var3 
4 Tree2 year1 var1 var2 var3 
5 Tree2 year2 var1 var2 var3 
6 Tree2 year3 var1 var2 var3 
+0

ありがとうございました - それは完璧に機能しました! – BruderK

+0

喜んで助けてください。質問を閉じるために提供された回答の1つを受け入れてください。 –

2

ソリューションはD.senのソリューション@とほぼ同じである、dplyrtidyrから関数を使用しています。しかし、私はすべての操作を1つのパイプラインに入れ、left_joinを使用してmerge関数を実行します。私はselectarrangeを使って、あなたの出力を模倣しようとしましたが、これらはすべてオプションです。 dt3が最終出力です。

# Create example datasets 
dt1 <- read.table(text = "Tree1 var1 var2 var3 
Tree2 var1 var2 var3", 
        header = FALSE, stringsAsFactors = FALSE) 

dt2 <- read.table(text = "Tree1 year1 year2 year3 
Tree2 year1 year2 year3", 
        header = FALSE, stringsAsFactors = FALSE) 

# Load packages 
library(dplyr) 
library(tidyr) 

# Process the data 
dt3 <- dt2 %>% 
    gather(Value, Year, V2:V4) %>% 
    left_join(dt1, by = "V1") %>% 
    select(c(paste0("V", 1:4), "Year")) %>% 
    arrange(V1) 

# See the output 
dt3 
    V1 V2 V3 V4 Year 
1 Tree1 var1 var2 var3 year1 
2 Tree1 var1 var2 var3 year2 
3 Tree1 var1 var2 var3 year3 
4 Tree2 var1 var2 var3 year1 
5 Tree2 var1 var2 var3 year2 
6 Tree2 var1 var2 var3 year3 
2

ベースRでは、df2を長く再構成した後にmergeを使用できます。 DSENのポストからのデータを使用:

merge(df1, 
     reshape(df2, direction="long", idvar="x1", varying=list(2:4))[-2], 
     by="x1") 

これはあなたがnames <- c(...)と名前をクリーンアップするかsetNamesに上記のコードをラップすることができます

 x1 x2.x x3 x4 x2.y 
1 Tree1 var1 var2 var3 year1 
2 Tree1 var1 var2 var3 year2 
3 Tree1 var1 var2 var3 year3 
4 Tree2 var1 var2 var3 year1 
5 Tree2 var1 var2 var3 year2 
6 Tree2 var1 var2 var3 year3 

を返します。

関連する問題