2013-06-13 27 views
6

Tôi có một số dữ liệu:Thêm một cột của bậc

test <- data.frame(A=c("aaabbb", 
"aaaabb", 
"aaaabb", 
"aaaaab", 
"bbbaaa") 
) 

và vân vân. Tất cả các phần tử đều có cùng độ dài và đã được sắp xếp trước khi tôi nhận được chúng.

Tôi cần tạo cột xếp hạng mới, "Thứ nhất", "Thứ hai", "Thứ ba", bất kỳ thứ gì sau đó có thể để trống và cần phải tính đến các mối quan hệ. Vì vậy, trong trường hợp trên, tôi muốn có được kết quả như sau:

A  B 
aaabbb First 
aaaabb Second 
aaaabb Second 
aaaaab Third 
bbbaaa 
bbbbaa 

Tôi đã xem thứ hạng() và một số bài đăng khác đã sử dụng nó, nhưng tôi không thể làm điều đó đang được tìm kiếm.

Trả lời

3

Làm thế nào về điều này:

test$B <- match(test$A , unique(test$A)[1:3]) 
test 
     A B 
1 aaabbb 1 
2 aaaabb 2 
3 aaaabb 2 
4 aaaaab 3 
5 bbbaaa NA 
6 bbbbaa NA 

Một trong nhiều cách để làm điều này. Có thể không phải là tốt nhất, nhưng có thể dễ dàng ghi nhớ và khá trực quan. Bạn có thể sử dụng unique vì bạn nhận được dữ liệu được sắp xếp trước.

Khi dữ liệu được sắp xếp một chức năng phù hợp đáng xem xét là rle, mặc dù nó hơi tù hơn trong ví dụ này:

rnk <- rle(as.integer(df$A))$lengths 
rnk 
# [1] 1 2 1 1 1 
test$B <- c(rep(1:3 , times = rnk[1:3]) , rep(NA, sum(rnk[-c(1:3)]))) 

rle tính độ dài (và các giá trị mà chúng tôi chưa thực sự quan tâm ở đây) của chạy các giá trị bằng nhau trong một vec-tơ - vì vậy một lần nữa điều này hoạt động vì dữ liệu của bạn đã được sắp xếp.

Và nếu bạn không để có khoảng trống sau khi mặt hàng đứng thứ ba nó thậm chí còn đơn giản hơn (và dễ đọc hơn):

test$B <- rep(1:length(rnk),times=rnk) 
+0

Tôi không biết, tôi nghĩ điều đó khá tốt. – thelatemail

+0

@thelatemail lol, chúc mừng. Tôi đoán vậy. Tôi cũng đã suy nghĩ về 'rle' khi dữ liệu được sắp xếp. Có vẻ thích hợp vì vậy tôi sẽ thêm nó như là một thay thế. –

+0

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn! – pak

3

Điều này có vẻ giống như một ứng dụng tốt cho các yếu tố:

test$B <- as.numeric(factor(test$A, levels = unique(test$A))) 

cumsum cũng đề cập đến nơi chúng tôi thêm 1 mỗi khi giá trị thay đổi:

test$B <- cumsum(c(TRUE, tail(test$A, -1) != head(test$A, -1))) 

(Giống như @Simon đã nói, có nhiều cách để thực hiện việc này ...)

+0

+1 cho phương pháp bù đắp đầu và đuôi. Tài giỏi. –

+1

Điều đó cũng hữu ích, đặc biệt nếu mọi thứ cần được xếp hạng. Trong trường hợp đặc biệt này, nó chỉ là đầu trang 3. Cảm ơn. Đôi khi tôi nghĩ tuyệt vời là có rất nhiều cách để làm mọi thứ, và đôi khi nó khiến tôi muốn thắp sáng tóc. – pak

+0

@flodel. Chỉ cần kiểm tra câu trả lời đầu tiên của bạn (sử dụng các yếu tố) trên một số dữ liệu của tôi và nhận ra rằng nó không hoạt động chính xác trong mọi trường hợp. Điều này là do có thể nói, kiểm tra $ A [10] để ** xem ** như thể nó bằng với thử nghiệm $ A [6], với các phần tử trung gian khác nhau. Xử lý chúng như là các yếu tố tác động bình đẳng, nơi nó có thể không được, trong trường hợp này. – pak

Các vấn đề liên quan