2017-04-08 5 views
2

2つの別々の列のグループを2つのキーと値のペアにまとめる必要があります。gather()を使用して、2つ(またはそれ以上)のキーと値のペアに2つ以上の列のグループを集める

library(dplyr) 
library(tidyr) 
ID = c(1:5) 
measure1 = c(1:5) 
measure2 = c(6:10) 
letter1 = c("a", "b", "c", "d", "e") 
letter2 = c("f", "g", "h", "i", "j") 

df = data.frame(ID, measure1, measure2, letter1, letter2) 
df = tbl_df(df) 
df$letter1 <- as.character(df$letter1) 
df$letter2 <- as.character(df$letter2) 

私は2つのメジャー列(measure1と測定2)の値の横にキー列(キーと値のペア)を1列になりたい:ここではいくつかのサンプルデータです。私もletter1とletter2に同じものが必要です。だから、これは(この場合は)完璧に動作しますが、私はこれを推測

df_measure = df %>% 
    select(ID, measure1, measure2) %>% 
    gather(measure_time, measure, -ID) %>% 
    mutate(id.extra = c(1:10)) 
df_letter = df %>% 
    select(ID, letter1, letter2) %>% 
    gather(letter_time, letter, -ID) %>% 
    mutate(id.extra = c(1:10)) 
df_long = df_measure %>% 
    left_join(df_letter, by = "id.extra") 

を:私は、私は(これは働いていた)に参加、その後、select()の二つの異なるデータセットを作成するために使用し、両方のデータセットに個別に集まっ使用してできることを考え出し(id.extraを分割したり作成したりすることなく)もっとエレガントに行うことができます。

答えて

3

次のようなものを使用できます。私はあなたの現在のアプローチから、これが正確にあなたの望む出力であるかどうか、それが冗長な情報をたくさん含んでいると思われるので、わからない。

df %>% 
    gather(val, var, -ID) %>% 
    extract(val, c("value", "time"), regex = "([a-z]+)([0-9]+)") %>% 
    spread(value, var) 
# # A tibble: 10 × 4 
#  ID time letter measure 
# * <int> <chr> <chr> <chr> 
# 1  1  1  a  1 
# 2  1  2  f  6 
# 3  2  1  b  2 
# 4  2  2  g  7 
# 5  3  1  c  3 
# 6  3  2  h  8 
# 7  4  1  d  4 
# 8  4  2  i  9 
# 9  5  1  e  5 
# 10  5  2  j  10 

これは、はるかに簡単に "data.table" からmelt + patternsで行われます。

library(data.table) 
melt(as.data.table(df), measure.vars = patterns("measure", "letter")) 

それとも、古い学校も、ちょうどベースからreshapeを使用することができますしかし、基底Rのreshapeは "tibbles"を好まないので、as.data.frameでそれを変換しなければならないことに注意してください。

reshape(as.data.frame(df), direction = "long", idvar = "ID", 
     varying = 2:ncol(df), sep = "") 
+0

は()関数はこれを行うことはできませんギャザー複数取ることができますdata.tableからmeltを使用することができますか? –

+1

@BenjaminTelkamp、何もできない?私は最初のアプローチで 'gather'関数を使用しました。しかし、列のすべてを集めてからそれらを広げなければなりません。 – A5C1D2H2I1M1N2O1R2T1

1

我々はmeasurepatterns

library(data.table) 
melt(setDT(df), measure = patterns("^measure", "^letter"), 
      value.name = c("measure", "letter")) 
#  ID variable measure letter 
# 1: 1  1  1  a 
# 2: 2  1  2  b 
# 3: 3  1  3  c 
# 4: 4  1  4  d 
# 5: 5  1  5  e 
# 6: 1  2  6  f 
# 7: 2  2  7  g 
# 8: 3  2  8  h 
# 9: 4  2  9  i 
#10: 5  2  10  j 
+0

これは素晴らしですが、コードでcolumnnまたは変数名を明示的に使用したい場合はどうすればよいですか?また、私は2つのキーと値のペアで終わりたいですか? –

+1

@BenjaminTelkamp、ちょうど "変数"の列を複製しています....なぜ、重複したデータを必要としますか? – A5C1D2H2I1M1N2O1R2T1

+0

この場合、私は小節とレターの2つの観測値を持っていますが、1つのグループについて3つの観測値があればどうなりますか? –

関連する問題