2016-06-10 6 views
2

У меня есть dataframe, который выглядит, как этоR: Преобразование нескольких столбцов в один столбец

+---------+--------+--------+--------+-------+ 
| ID | week1_t| week1_a| week2_t|week2_a| 
+---------+--------+--------+--------+-------+ 
| 1 | 12  | 22  | 17 | 4 | 
| 1 | 15  | 32  | 18 | 5 | 
| 1 | 24  | 12  | 29 | 6 | 
| 2 | 45  | 11  | 19 | 8 | 
| 2 | 23  | 33  | 20 | 10 | 
+---------+--------+--------+--------+-------+ 

Есть 48 столбцов (неделя 1 - 24) с «т» и «а» суффиксов. Я хочу, чтобы объединить все столбцы неделю в одну колонку «недели», как это:

+---------+--------+--------+-------- 
| ID | week | t  | a | 
+---------+--------+--------+-------- 
| 1 | 1  | 22  | 17 | 
| 1 | 2  | 32  | 18 | 
| 1 | 3  | 12  | 19 | 
| 1 | 5  | 33  | 20 | 
+---------+--------+--------+------- 

Как я могу идти о том, чтобы это преобразование в R? Я не могу придумать способ сделать это за пределами нескольких операторов if и для циклов.

данных

dd <- read.table(header = TRUE, text = "ID week1_t week1_a week2_t week2_a 
    1  12  22  17  4 
    1  15  32  18  5 
    1  24  12  29  6 
    2  45  11  19  8 
    2  23  33  20  10") 
+0

Пакет dplyr имеет все функции, которые вам нужны. Вот вам полезный чит-лист: https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf –

+1

, пожалуйста, покажите, что вы пробовали. и не используйте этот формат таблицы. – rawr

+4

'reshape (dd, dir = 'long', variableing = lapply (c ('t', 'a'), grep, names (dd)), timevar = 'week')' – rawr

ответ

2

Вы можете использовать data.tablemelt:

library(data.table) 
setDT(dd) 
melt(dd, id = 1, measure=patterns("_t$", "_a$"), value.name = c("t", "a"), 
    variable.name = "week") 

    ID week t a 
1: 1 1 12 22 
2: 1 1 15 32 
3: 1 1 24 12 
4: 2 1 45 11 
5: 2 1 23 33 
6: 1 2 17 4 
7: 1 2 18 5 
8: 1 2 29 6 
9: 2 2 19 8 
10: 2 2 20 10 

Как вы можете прочитать из ?melt:

measure.vars теперь также принимает список символов/целого числа векторы до расплавляются в несколько столбцов - т. е. расплавляются в более одного значения столбцов одновременно. Используйте шаблоны функций, чтобы обеспечить несколько шаблонов . Смотрите раздел примеры

+0

Не могу поверить, что это было просто... – Parseltongue

0

С tidyr/dplyr:

library(dplyr) 
library(tidyr) 

     # add row index so later spreading indexed correctly 
dd %>% add_rownames() %>% 
    # melt to long format 
    gather(week, value, -ID, -rowname) %>% 
    # separate week number from variable suffix 
    separate(week, c('week', 'var')) %>% 
    # reduce week number to actual number 
    mutate(week = extract_numeric(week)) %>% 
    # spread a and t values back to wide form 
    spread(var, value) %>% 
    # clean up 
    select(-rowname) 

# Source: local data frame [10 x 4] 
# 
#  ID week  a  t 
# (int) (dbl) (int) (int) 
# 1  1  1 22 12 
# 2  1  2  4 17 
# 3  1  1 32 15 
# 4  1  2  5 18 
# 5  1  1 12 24 
# 6  1  2  6 29 
# 7  2  1 11 45 
# 8  2  2  8 19 
# 9  2  1 33 23 
# 10  2  2 10 20 
Смежные вопросы