2017-04-08 78 views
2

我想將兩個獨立的列組收集到兩個鍵值對中。下面是一些示例性數據:使用gather()將兩個(或更多)列組收集到兩個(或更多)鍵值對中

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) 

我希望兩個量度列(措施1和measure2)的值是在一列中具有鍵柱旁邊(鍵 - 值對)。我也希望letter1和letter2一樣。我想,我可以使用select()創建兩個不同的數據集,用兩個數據集seperately收集,然後加入(這工作):

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") 

所以這完美的作品(在這種情況下),但我想這可以做得更優雅(沒有像分裂或創建'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 

這是更容易與melt + patterns完成從 「data.table」:

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

或者你也可以是老派的,只是使用reshape從基地R.但是,請注意,基礎R的reshape不喜歡「蹣跚」,所以你必須將它與as.data.frame轉換)。

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

的聚攏()函數不能做到這一點? –

+1

@BenjaminTelkamp,不能做什麼?我在第一種方法中使用了「收集」功能。但是,你必須收集*所有的列,然後將它們分開。 – A5C1D2H2I1M1N2O1R2T1

1

我們可以使用從data.tablemelt可以採取多種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或變量名稱,我該怎麼辦?而且我想結束兩個鍵值對? –

+1

@BenjaminTelkamp,只是複製「變量」列....你爲什麼要重複數據? – A5C1D2H2I1M1N2O1R2T1

+0

在這種情況下,我有兩個意見的措施和字母,但如果我有一個組的三個意見? –

相關問題