Объединение строк со столбцами для создания вертикальной таблицы - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь выяснить, как объединить 2 фрейма данных для создания вертикальной таблицы данных.Вот некоторые примеры данных:

people <- data.frame(person = c("John","David","Peter"), company = c("A", "B", "C"))
grades <- data.frame(person1=c(10, 40, 50, 60), person2=c(60,70,80, 100), person3=c(33,44,55, 75))

ПРИМЕЧАНИЕ. Порядок столбцов в grades совпадает с порядком столбца person во фрейме данных people.

Я хотел бы получить фрейм данных, подобный следующему, но не могу придумать, как туда добраться.Предпочел бы решение с использованием базы R (я использую более старую версию R, поэтому некоторые пакеты не работают для меня):

person | company | grade
-------------------------
 John  |    A    | 10
 John  |    A    | 40
 John  |    A    | 50
 John  |    A    | 60
David  |    B    | 60
David  |    B    | 70
David  |    B    | 80
David  |    B    | 100
Peter  |    C    | 33
Peter  |    C    | 44
Peter  |    C    | 55
Peter  |    C    | 75

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Мы изменяем имена столбцов 'grades' на столбец 'person' с 'people', gather на 'long', а затем делаем left_join

library(tidyverse)
setNames(grades, people$person) %>% 
     gather(person, grade) %>% 
    left_join(people)
#   person grade company
#1    John    10       A
#2    John    40       A
#3    John    50       A
#4    John    60       A
#5   David    60       B
#6   David    70       B
#7   David    80       B
#8   David   100       B
#9   Peter    33       C
#10  Peter    44       C
#11  Peter    55       C
#12  Peter    75       C

Илииспользуя base R с merge

merge(stack(setNames(grades, people$person)), 
      people, all.x = TRUE, by.x = 'ind', by.y = 'person')
0 голосов
/ 12 февраля 2019

Базовая опция R с использованием cbind будет

idx <- rep(seq_along(people$person), each = dim(grades)[1])
cbind(people[idx,], stack(unlist(grades))["values"])

Результат

#    person company values
#1     John       A     10
#1.1   John       A     40
#1.2   John       A     50
#1.3   John       A     60
#2    David       B     60
#2.1  David       B     70
#2.2  David       B     80
#2.3  David       B    100
#3    Peter       C     33
#3.1  Peter       C     44
#3.2  Peter       C     55
#3.3  Peter       C     75

Используйте unlist и stack для grades, чтобы получить

stack(unlist(grades))
   values          ind
1      10 john_grades1
2      40 john_grades2
3      50 john_grades3
4      60 john_grades4
5      60       david1
6      70       david2
7      80       david3
8     100       david4
9      33          pj1
10     44          pj2
11     55          pj3
12     75          pj4

Поскольку «Порядок столбцов в оценках такой же, как порядок столбцов в кадре данных людей».мы можем использовать cbind далее, после того как мы расширили people, чтобы получить правильное количество строк.

(idx <- rep(seq_along(people$person), each = dim(grades)[1]))
# [1] 1 1 1 1 2 2 2 2 3 3 3 3

Другой вариант, возможно, немного быстрее, будет

cbind(people[idx,], data.frame(grade = unlist(grades, use.names = FALSE)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...