В R преобразование Wide dataframe в Long с сохранением некоторой информации - PullRequest
2 голосов
/ 20 сентября 2019

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

football_enjoyment <- c(5,3)
basketball_enjoyment <- c(5,5)
football_participation <- c(1,2)
basketball_participation <- c(1,3)

df<- data.frame(football_enjoyment,football_participation, 
                basketball_enjoyment,basketball_participation)
df$id <- seq.int(nrow(df))
df

##  football_enjoyment football_participation basketball_enjoyment basketball_participation id
#                  5                      1                    5                        1    1
#                  3                      2                    5                        3    2

Я хочу, чтобы это было так

sports <- c("football","football", "basketball","basketball")
enjoyment_score <- c(5,3,5,5)
participation_score <- c(1,2,1,3)

id <- c(1,2)

df2 <- data.frame(sports, enjoyment_score,participation_score, id)
df2

##    sports    enjoyment_score    participation_score id
#   football               5                   1        1
#   football               3                   2        2
# basketball               5                   1        1
# basketball               5                   3        2

Я застрял со структурой, и имена столбцов / строк предназначены только длядемонстрационная цель.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

С tidyverse вы можете сделать:

library(tidyverse)
library(reshape2)

df %>% gather("variable", "value", - id) %>%
    separate(variable, into = c("sports", "variable"), sep = "_") %>%
    dcast(id + sports ~ variable) %>% arrange(desc(sports))

#  id     sports enjoyment participation
#1  1   football         5             1
#2  2   football         3             2
#3  1 basketball         5             1
#4  2 basketball         5             3

Или, в base вы можете сделать:

df2 <- reshape(df, varying = c("football_enjoyment", "football_participation", "basketball_enjoyment", "basketball_participation"), 
   direction = "long", 
   idvar = "id", 
   sep = "_", 
   timevar = "sports", 
   times = c("football", "basketball"), v.names = c('enjoyment', 'participation'))
rownames(df2) <- NULL

#  id     sports enjoyment participation
#1  1   football         5             1
#2  2   football         3             2
#3  1 basketball         5             1
#4  2 basketball         5             3
0 голосов
/ 20 сентября 2019

tidyr 1.0.0 имеет функцию pivot_longer, которая может сделать это:

library(tidyr)

football_enjoyment <- c(5,3)
basketball_enjoyment <- c(5,5)
football_participation <- c(1,2)
basketball_participation <- c(1,3)

df<- data.frame(football_enjoyment,football_participation, 
                basketball_enjoyment,basketball_participation)
df$id <- seq.int(nrow(df))
df
#>   football_enjoyment football_participation basketball_enjoyment
#> 1                  5                      1                    5
#> 2                  3                      2                    5
#>   basketball_participation id
#> 1                        1  1
#> 2                        3  2

df %>% pivot_longer(-id, names_to = c("sports",".value"), names_sep = "_")
#> # A tibble: 4 x 4
#>      id sports     enjoyment participation
#>   <int> <chr>          <dbl>         <dbl>
#> 1     1 football           5             1
#> 2     1 basketball         5             1
#> 3     2 football           3             2
#> 4     2 basketball         5             3

Создано в 2019-09-20 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...