2011-08-28 39 views
5

Vấn đề này có vẻ tầm thường nhưng tôi ở cuối trí thông minh sau nhiều giờ đọc.Tạo một danh sách véc tơ có chiều dài chạy của vector gốc với cùng độ dài như vector gốc

Tôi cần tạo một vectơ có độ dài bằng với vectơ đầu vào liệt kê cho từng giá trị của vectơ đầu vào tổng số cho giá trị đó. Vì vậy, bằng cách ví dụ, tôi muốn tạo ra cột cuối cùng của dataframe này:

> df 
    customer.id transaction.count total.transactions 
1   1     1     4 
2   1     2     4 
3   1     3     4 
4   1     4     4 
5   2     1     2 
6   2     2     2 
7   3     1     3 
8   3     2     3 
9   3     3     3 
10   4     1     1 

Tôi nhận ra điều này có thể được thực hiện theo hai cách, hoặc bằng cách sử dụng độ dài chạy của cột đầu tiên, hoặc nhóm cột thứ hai sử dụng đầu tiên và áp dụng tối đa.

Tôi đã thử cả hai tapply:

> tapply(df$transaction.count, df$customer.id, max) 

Và RLE:

> rle(df$customer.id) 

Nhưng cả hai quay trở lại một vector có độ dài ngắn hơn so với bản gốc:

[1] 4 2 3 1 

Bất kỳ sự giúp đỡ lòng biết ơn được chấp nhận!

+0

Cảm ơn rất nhiều cho câu trả lời tuyệt vời! Tất cả các câu trả lời đều có hiệu quả. –

Trả lời

6

Bạn có thể làm điều đó mà không cần tạo quầy giao dịch với:

df$total.transactions <- with(df, 
        ave(transaction.count , customer.id , FUN=length)) 
+0

Tôi đã sử dụng các biến thể này liên tục trong vài tuần qua với các chức năng khác nhau thay cho độ dài và nó thực sự hữu ích - cũng rất nhanh so với một số triển khai khác. Tôi chỉ ước mình có đủ đại diện để thăng hoa! Cảm ơn! –

0

Có thể bạn đang tìm cách tiếp cận chia kết hợp áp dụng; có một cái nhìn tại ddply trong gói plyr hoặc split chức năng trong R. cơ sở

1

Bạn có thể sử dụng rle với rep để có được những gì bạn muốn:

x <- rep(1:4, 4:1) 
> x 
[1] 1 1 1 1 2 2 2 3 3 4 

rep(rle(x)$lengths, rle(x)$lengths) 
> rep(rle(x)$lengths, rle(x)$lengths) 
[1] 4 4 4 4 3 3 3 2 2 1 

Đối với mục đích hoạt động, bạn có thể lưu trữ các đối tượng RLE riêng biệt vì vậy nó chỉ được gọi một lần.

Hoặc khi Karsten đề nghị với ddply từ plyr:

require(plyr) 

#Expects data.frame 
dat <- data.frame(x = rep(1:4, 4:1)) 
ddply(dat, "x", transform, total = length(x)) 
Các vấn đề liên quan