Как использовать collect () с более чем одной x-переменной? - PullRequest
4 голосов
/ 04 апреля 2020

Я относительно новичок в R и борюсь со следующей проблемой: у меня есть фрейм данных, который состоит из двух наборов переменных x и y, то есть x1, y1 и x2, y2. Я хотел бы использовать сбор или любую другую функцию, которая может помочь создать новый фрейм данных с объединенными переменными x1 и x2 в одну переменную x. Я попытался использовать сбор, но вижу только примеры, примененные к фреймам данных с одной переменной x. Сильфон - мой представитель с желаемым результатом также.

Ваша помощь очень ценится. Спасибо!

library(tidyr)

(df <- data.frame(x1=c(1,2,3),y1=c(10,14,12), x2=c(2,3,4),y2=c(12,13,11)))
#>   x1 y1 x2 y2
#> 1  1 10  2 12
#> 2  2 14  3 13
#> 3  3 12  4 11

(df_tall <- gather(df,"z", "y", y1:y2))
#>   x1  z  y
#> 1  1 y1 10
#> 2  2 y1 14
#> 3  3 y1 12
#> 4  1 x2  2
#> 5  2 x2  3
#> 6  3 x2  4
#> 7  1 y2 12
#> 8  2 y2 13
#> 9  3 y2 11

# desired output
print('Desired output')
#> [1] "Desired output"
(df_mod <- data.frame(x=c(1,2,2,3,3,4),y=c(10,14,12,12,13,11), z=c("y1", "y1", "y2", "y1", "y2", "y2")))
#>   x  y  z
#> 1 1 10 y1
#> 2 2 14 y1
#> 3 2 12 y2
#> 4 3 12 y1
#> 5 3 13 y2
#> 6 4 11 y2

Создано в 2020-04-03 пакетом представить (v0.2.1)

Ответы [ 3 ]

3 голосов
/ 04 апреля 2020

gather был заменен на pivot_longer в tidyr, что позволяет это.

tidyr::pivot_longer(df, cols = everything(), 
                        names_to = c('.value', 'z'),
                        names_pattern = '(.)(.)')

#   z       x     y
#  <chr> <dbl> <dbl>
#1 1         1    10
#2 2         2    12
#3 1         2    14
#4 2         3    13
#5 1         3    12
#6 2         4    11

.value используется, когда мы хотим, чтобы часть имени столбца представляла собой данные в отдельном столбце. В names_pattern мы используем регулярные выражения для указания групп, на которые делятся столбцы. В этом случае мы используем каждый символ как отдельную группу, отсюда и шаблон. ((.)(.)).

2 голосов
/ 04 апреля 2020

Можно использовать reshape здесь:

reshape(df, direction="long", varying=1:4, sep="", timevar="z")
    z x  y id
1.1 1 1 10  1
2.1 1 2 14  2
3.1 1 3 12  3
1.2 2 2 12  1
2.2 2 3 13  2
3.2 2 4 11  3
1 голос
/ 04 апреля 2020

Мы можем использовать data.table методы

library(data.table)
melt(setDT(df), measure = patterns('^x', '^y'),
        variable.name = 'z', value.name = c('x', 'y'))
#   z x  y
#1: 1 1 10
#2: 1 2 14
#3: 1 3 12
#4: 2 2 12
#5: 2 3 13
#6: 2 4 11
...