2016-09-27 28 views
5

Tôi có dữ liệu trong các hình thức sau đây:Làm thế nào để ghép hàng với cùng một giá trị trong một cột của một dataframe trong R

set.seed(1234) 
data <- data.frame(cbind(runif(40,0,10), rep(seq(1,20,1), each = 2))) 
data <- data[sample(nrow(data)),] 
colnames(data) <- c("obs","subject") 
head(data) 

    obs  subject 
1.5904600  12 
8.1059855  13 
5.4497484  6 
0.3999592  12 
2.5880982  19 
2.6682078  9 
    ...   ... 

Hãy nói rằng tôi chỉ có hai quan sát (cột "obs") theo chủ đề (cột "chủ đề", trong đó đối tượng được đánh số từ 1 đến 20).

Tôi muốn "nhóm" hàng theo giá trị của cột "chủ đề". Chính xác hơn, tôi muốn "sắp xếp" dữ liệu theo chủ đề, nhưng bảo tồn thứ tự được hiển thị ở trên. Do đó, dữ liệu cuối cùng sẽ như sau:

obs  subject 
1.5904600  12 
0.3999592  12 
8.1059855  13 
2.3656473  13 
5.4497484  6 
7.2934746  6 

Bất kỳ ý tưởng nào? Tôi nghĩ có lẽ xác định mỗi hàng tương ứng với một chủ đề với which:

which(data$subject==x) 

sau đó rbind các hàng trong một vòng lặp nhưng tôi chắc chắn có một cách đơn giản hơn và nhanh hơn để làm điều này, phải không?

+3

Dữ liệu mẫu của bạn là ma trận, nó có phải là data.frame không? – zx8754

+0

hãy thử một cái gì đó như thế này: 'dữ liệu [thứ tự (dữ liệu $ chủ đề),] ' – Bulat

+0

@Bulat chúng tôi sẽ mất thứ tự ban đầu. – zx8754

Trả lời

5

Chuyển đổi các yếu tố với các mức sau đó ra lệnh:

data$group <- factor(data$subject, levels = unique(data$subject)) 
data[ order(data$group), ] 

#   obs subject group 
# 1 1.59046003  12 12 
# 4 0.39995918  12 12 
# 2 8.10598552  13 13 
# 30 2.18799541  13 13 
# ... 
-1

Nó dựa trên zx8754 nhưng nó duy trì kiểu dữ liệu:

library(dplyr) #arrange function 

group<-factor(data[,'subject'], levels=unique(data[,'subject'])) 
data<-cbind(data,group) 
data<-arrange(as.data.frame(data),group) 
data<-as.matrix(data[,-3]) 
-3

dplyr là một gói phần mềm tuyệt vời với động từ hữu ích khác nhau, một trong đó là arrange(variable), thực hiện những gì bạn muốn ở đây và thanh lịch hơn (kết quả nói chung cũng là một data.frame, vì vậy bạn không cần phải cbind):

require(dplyr) 
as.data.frame(data) %>% arrange(subject) 
# or, if you want reverse order: 
as.data.frame(data) %>% arrange(-subject) 

(Đối với vấn đề đó, data.table cũng tuyệt vời. Trên thực tế, bạn có thể đưa cả hai được hợp nhất vào gói dtplyr)

+0

Đây không phải là những gì OP – zx8754

+0

Ồ, bạn muốn đặt hàng theo 'chủ đề', sau đó đặt hàng ban đầu là 'ám ảnh'. – smci

0

Làm tổ dữ liệu theo obs và không cần thiết nữa. Tibble kết quả sẽ giữ lại thứ tự ban đầu nhưng subject sẽ được nhóm lại.

library(tidyr) 
data %>% nest(obs) %>% unnest() 

# A tibble: 6 × 2 
# subject  obs 
# <int>  <dbl> 
#1  12 1.5904600 
#2  12 0.3999592 
#3  13 8.1059855 
#4  6 5.4497484 
#5  19 2.5880982 
#6  9 2.6682078 
Các vấn đề liên quan