2010-09-06 36 views
54

Tôi có dataframe sau (df)Thêm một cột vào một dataframe trong R

start  end 
1 14379 32094 
2 151884 174367 
3 438422 449382 
4 618123 621256 
5 698271 714321 
6 973394 975857 
7 980508 982372 
8 994539 994661 
9 1055151 1058824 
. .  . 
. .  . 
. .  . 

Và một vector dài với giá trị số (vec).

Tôi muốn thêm vào mỗi hàng một cột khác, với giá trị trung bình của các giá trị ở các vị trí tương ứng trong vec. ví dụ: hàng đầu tiên sẽ có mean(vec[14379:32094]). Tôi đã thử chơi với transform nhưng không thể hoàn thành nhiệm vụ đơn giản này.

+1

Tôi có một chân bên ngoài văn phòng và không thể đưa ra ví dụ quá nhanh, nhưng FWIW, hãy xem? Áp dụng. –

Trả lời

71

Đó là một trường hợp sử dụng khá chuẩn cho apply():

R> vec <- 1:10 
R> DF <- data.frame(start=c(1,3,5,7), end=c(2,6,7,9)) 
R> DF$newcol <- apply(DF,1,function(row) mean(vec[ row[1] : row[2] ])) 
R> DF 
    start end newcol 
1  1 2 1.5 
2  3 6 4.5 
3  5 7 6.0 
4  7 9 8.0 
R> 

Bạn cũng có thể sử dụng plyr nếu bạn thích nhưng ở đây là không có nhu cầu thực sự để vượt qua chức năng từ R. cơ sở

+0

+1 Cảm ơn! Re. 'plyr' - làm thế nào tôi có thể sử dụng nó nếu tôi muốn mỗi hàng được xử lý bởi chính nó? –

+2

Bạn đang nói về điều gì? Điều này xử lý từng cái một. Làm thế nào khác nó sẽ làm điều này? –

+0

mỗi cái gì? theo như tôi hiểu, 'plyr' hoạt động trên nhóm hàng. –

-1

Thậm chí nếu đó là một câu hỏi 7 tuổi, những người mới đến R nên cân nhắc sử dụng gói data.table.

Một data.table là một data.frame để tất cả các bạn có thể làm cho/vào một data.frame bạn cũng có thể làm. Nhưng nhiều người nghĩ rằng ĐƠN HÀNG là nhanh hơn với data.table.

vec <- 1:10 
library(data.table) 
DT <- data.table(start=c(1,3,5,7), end=c(2,6,7,9)) 
DT[,new:=apply(DT,1,function(row) mean(vec[ row[1] : row[2] ]))] 
+0

không chắc chắn lý do tại sao trên trái đất tôi đã downvoted ở đây ... vô lý – statquant

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