Значения строки в столбцах в R - PullRequest
1 голос
/ 12 февраля 2020

Я новичок в R и пытаюсь построить свою первую модель регрессии. Однако я пытаюсь преобразовать свои данные.

Мои данные организованы в следующем формате:

resp_id  task_id  alt  A_1  B_1   C_1   D_1   E_1
1        25       1    3    0.4   0.15  0     0
1        25       2    2    0.7   0.05  0.05  0
1        26       1    1    0.4   0     0     0
1        26       2    3    0.4   0.05  0.1   0.05

Я ищу способ преобразовать мои данные из формата выше в формат ниже:

resp_id  task_id  alt  A_1  B_1   C_1   D_1   E_1   A_2  B_2  C_2  D_2  E_2
1        25       1    3    0.4   0.15  0     0     2    0.7  0.05 0.05 0
1        26       1    1    0.4   0     0     0     3    0.4  0.05 0.1  0.05 

Концептуально я понимаю, что мне нужно l oop через каждую строку, пока мы не доберемся до столбца 'alt' со значением 2. Затем все следующие значения столбца в этой строке должны быть скопированы как новые столбцы в предыдущую строку, а строка, из которой копируются значения, должна быть удалена.

Я рассмотрел способы перехода от длинного набора данных к широкому набору данных в R, но я не смог ' мне не удается преобразовать мой набор данных в то, что я хочу.

Учитывая отсутствие опыта программирования, кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Это работа для pivot_wider из пакета tidyr:

library(tidyverse)

df %>%
  # remove the existing suffix and instead use alt to enumerate the columns
  rename_at(vars(A_1:E_1), ~gsub("_[0-9]*$", "", .)) %>%
  pivot_wider(names_from = alt, values_from = A:E)

Результат:

# A tibble: 2 x 12
  resp_id task_id   A_1   A_2   B_1   B_2   C_1   C_2   D_1   D_2   E_1   E_2
    <int>   <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1       1      25     3     2   0.4   0.7  0.15  0.05     0  0.05     0  0   
2       1      26     1     3   0.4   0.4  0     0.05     0  0.1      0  0.05
1 голос
/ 12 февраля 2020

Некоторое время go Я тоже боролся с такими трансформациями. Я всегда ищу самое простое решение. В этом случае я бы рекомендовал reshape

reshape(df, direction = "wide", timevar = "alt", idvar = "task_id", sep = "")

  task_id resp_id1 A_11 B_11 C_11 D_11 E_11 resp_id2 A_12 B_12 C_12 D_12 E_12
1      25        1    3  0.4 0.15    0    0        1    2  0.7 0.05 0.05 0.00
3      26        1    1  0.4 0.00    0    0        1    3  0.4 0.05 0.10 0.05
...