Базовая опция 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)))