2017-02-09 29 views
-1

我擁有廣泛的數據集,看起來像這樣的工作:整理「並排側」數據集

library(tibble) 
wide_data <- data_frame(month_1 = c("Jan", "Feb", "Mar", "Jun"), 
         score_1 = c(4, 5, 6, 4), 
         month_2 = c("Jan", "Mar", NA, NA), 
         score_2 = c(3, 2, NA, NA), 
         month_3 = c("Feb", "Mar", "Jun", NA), 
         score_3 = c(8, 7, 4, NA)) 

我想產生如下:

id month score 
1 Jan 4 
1 Feb 5 
1 Mar 6 
1 Jun 4 
2 Jan 3 
2 Mar 2 
3 Feb 8 
3 Mar 7 
3 Jun 4 

注意,初始數據集中的月份並不排列整個觀測值。 「整理」這個最好的方法是什麼?我是否應該一次將基礎數據讀入R兩列並使用bind_rows?如果是這樣,那麼最優雅的方式是什麼?

+0

'庫(data.table); (setDT(wide_data),measure = patterns(「^ month」,「^ score」))' –

+0

謝謝!如果我的ID變量不僅僅是標準索引(例如date_S97和date_S94,而不是date_1和date_2),有什麼方法可以在熔化的數據框中恢復這些變量? – joebruin

+0

請參閱[this](http://stackoverflow.com/questions/41883573/convert-numeric-representation-of-variable-column-to-original-string-following/) –

回答

0

通過搜索相關字符串的列名,可以將多個列綁定在一起。我在這裏使用grep來實現。

new <- data_frame(
    month = do.call(c, wide_data[ , grep("^month_", names(wide_data)) ]), 
    score = do.call(c, wide_data[ , grep("^score_", names(wide_data)) ]) 
) 

其中給出:

> new 
# A tibble: 12 × 2 
    month score 
    <chr> <dbl> 
1 Jan  4 
2 Feb  5 
3 Mar  6 
4 Jun  4 
5 Jan  3 
6 Mar  2 
7 <NA> NA 
8 <NA> NA 
9 Feb  8 
10 Mar  7 
11 Jun  4 
12 <NA> NA