2016-06-03 20 views
6

Tôi có một số dữ liệu như sau:Kết hợp danh sách với vector R

num = list() 
num[[1]] = c(1,2,3) 
num[[2]] = c(4,5,6,7) 
name = c("Alex", "Patrick") 

Làm thế nào để kết hợp nó vào một khung dữ liệu mà trông như thế này?

Alex  1 
Alex  2 
Alex  3 
Patrick  4 
Patrick  5 
Patrick  6 
Patrick  7 

Tôi rất tiếc vì đã đăng câu hỏi có thể là câu hỏi rõ ràng. Tôi đã tìm kiếm rộng rãi và không tìm thấy câu trả lời, có lẽ vì tôi không biết cách mô tả tốt về truy vấn này.

+3

'chồng (setNames (num, tên)) ' – user20650

+0

@ user20650 thêm như một câu trả lời, chức năng mới trong ngày - chồng! – zx8754

+2

@ zx8754; ha, yup tôi hiếm khi nhớ nó. .. nhưng tôi nghĩ rằng tôi sẽ để nó lúng túng trong các ý kiến, vì nó thực sự chỉ làm những gì câu trả lời của Richard S, nhưng với quần áo trên. – user20650

Trả lời

8

Hãy dùng thử. Chức năng lengths() mới có ích ở đây.

data.frame(name = rep(name, lengths(num)), num = unlist(num)) 
#  name num 
# 1 Alex 1 
# 2 Alex 2 
# 3 Alex 3 
# 4 Patrick 4 
# 5 Patrick 5 
# 6 Patrick 6 
# 7 Patrick 7 

Để hiểu điều này tốt hơn một chút, hãy chia thành các phần từ trong ra ngoài. lengths() cho chúng ta biết độ dài của mỗi phần tử trong một danh sách, vì vậy chúng tôi có

lengths(num) 
# [1] 3 4 

Bây giờ chúng ta sử dụng như là times luận trong rep() để tái tạo các yếu tố của name.

rep(name, lengths(num)) 
# [1] "Alex" "Alex" "Alex" "Patrick" "Patrick" "Patrick" "Patrick" 

Vì vậy, đó là cột đầu tiên. Đối với cột thứ hai, chúng tôi chỉ cần chuyển num thành một vector nguyên tử với unlist().

unlist(num) 
# [1] 1 2 3 4 5 6 7 

Đặt chúng lại với nhau như minh họa ở trên và chúng tôi có khung dữ liệu mới.

+0

Điều này thật tuyệt vời. Một chút khó khăn để làm theo các chức năng lồng nhau nhưng tôi nghĩ rằng tôi nhận được nó. Cảm ơn. –

+1

@AlexLach - Tôi đã thêm một số giải thích. Hy vọng nó giúp –

3

Một tùy chọn khác:

data.table::rbindlist(Map(function(x,y) data.frame(name = x, num = y), name, num)) 
     name num 
1: Alex 1 
2: Alex 2 
3: Alex 3 
4: Patrick 4 
5: Patrick 5 
6: Patrick 6 
7: Patrick 7 
2

Hoặc chúng ta có thể sử dụng stack sau khi đặt names của 'num' với 'tên'

stack(setNames(num, name))[2:1] 
#  ind values 
#1 Alex  1 
#2 Alex  2 
#3 Alex  3 
#4 Patrick  4 
#5 Patrick  5 
#6 Patrick  6 
#7 Patrick  7 

Chỉ cần để ý rằng điều này đã được đăng trong các ý kiến ​​của @ user20650 . Trong trường hợp đó, chúng tôi cũng có thể làm

library(reshape2) 
melt(setNames(num, name))[2:1] 
#  L1 value 
#1 Alex  1 
#2 Alex  2 
#3 Alex  3 
#4 Patrick  4 
#5 Patrick  5 
#6 Patrick  6 
#7 Patrick  7 
Các vấn đề liên quan