Cách mở rộng khung dữ liệu trong R


15

Tôi đang gặp vấn đề trong khi thực hiện một số phân tích với R.

Tôi có một khung dữ liệu như thế này:

Name | Group | Count
Person 1 | A | 3
Person 2 | A | 1
Person 3 | A | 0
Person 1 | B | 5 
Person 2 | B | 0
Person 3 | B | 1
Person 1 | C | 1

và tôi cần phải "mở rộng" nó (không chắc là đúng thuật ngữ) như thế này:

Person 1 | A
Person 1 | A
Person 1 | A
Person 2 | A
Person 1 | B
Person 1 | B

Vân vân.

Vì vậy, nó lấy giá trị của cặp Người 1 và A (trong ví dụ này là 3) và tạo ba hàng với Người 1 và A và làm như vậy cho mọi Người - Tổ chức nhóm. Không thể tìm ra bất kỳ từ tốt để tìm kiếm trực tuyến.



Bạn nên khám phá reshape2gói trong R. Nó cũng có thể giúp dput2 ví dụ dữ liệu: một với đầu vào và một với đầu ra.
Zach

Tôi đã cung cấp một câu trả lời nhưng tôi đoán đây là câu hỏi lập trình R nhiều hơn câu hỏi thống kê, vì vậy có lẽ nó nên được di chuyển sang nơi khác.
Gala

Cảm ơn Gaël đã trả lời và giúp đỡ với định dạng trong câu hỏi của tôi.
Juha-Matti S.

Câu trả lời:


10

Mặc dù nó là một gói rất hữu ích, tôi nghĩ rằng việc định hình lại là quá mức trong trường hợp này, đại diện có thể thực hiện công việc.

Dưới đây là một số dữ liệu ví dụ:

df <- data.frame(
     name=c("Person 1", "Person 2", "Person 3", "Person 1", "Person 2", "Person 3"),
     group=c("A", "A", "A", "B", "B", "B"),
     count=c(3,1,0,5,0,1))

Bây giờ, để mở rộng phạm vi, nó:

expanded <- data.frame(name = rep(df$name, df$count),
                       group = rep(df$group, df$count))

Tôi không thể tìm cách làm việc trực tiếp trên khung dữ liệu trên đỉnh đầu của mình vì vậy tôi đang làm việc riêng với từng biến và sau đó lắp lại chúng, điều này hơi xấu nhưng vẫn ổn nếu bạn luôn luôn sử dụng cùng một biến cho số đếm.


7
Làm thế nào về điều này : df[rep(seq_len(nrow(df)), df$count), 1:2]?
chl

@chl, thưa ngài thật tài giỏi!
Chris

15

Bạn có thể sử dụng chức năng không thể thực hiện được từ gói định hình lại.

Cho df trên (bởi @ Gaël Laurans)

library(reshape)

expanded<-untable(df[,c(1,2)], num=df[,3])

name group
1   Person 1     A
1.1 Person 1     A
1.2 Person 1     A
2   Person 2     A
4   Person 1     B
4.1 Person 1     B
4.2 Person 1     B
4.3 Person 1     B
4.4 Person 1     B
6   Person 3     B

untablethực hiện chính xác những gì tôi đã đề cập trong bình luận của mình :-) Cảm ơn đã nhắc nhở tôi về chức năng đó!
chl

1

uncounttừ tidyrbây giờ cho kết quả tương tự như trên.

library(tidyr)
df %>% uncount(Count)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.