2011-11-02 18 views
13

Tôi muốn thêm cột có nghĩa là dựa trên cột yếu tố trong Rdata.frame. Như thế này:Thêm một cột phương tiện theo nhóm vào dữ liệu gốc

df1 <- data.frame(X = rep(x = LETTERS[1:2], each = 3), Y = 1:6) 
df2 <- aggregate(data = df1, Y ~ X, FUN = mean) 
df3 <- merge(x = df1, y = df2, by = "X", suffixes = c(".Old",".New")) 
df3 
# X Y.Old Y.New 
# 1 A  1  2 
# 2 A  2  2 
# 3 A  3  2 
# 4 B  4  5 
# 5 B  5  5 
# 6 B  6  5 

Để thực hiện vấn đề này tôi đã tạo hai số không cần thiết data.frames. Tôi muốn biết cách thêm cột cột có nghĩa là vào cột số nguyên vào số data.frame ban đầu của tôi mà không cần tạo thêm bất kỳ data.frames. Xin cám ơn về thời gian và sự giúp đỡ của bạn.

Trả lời

12

Đây là chức năng của ave.

df1$Y.New <- ave(df1$Y, df1$X) 
+0

Đây là những gì tôi đang tìm kiếm. Cảm ơn – MYaseen208

7

ddplytransform để giải cứu (mặc dù tôi chắc chắn bạn sẽ nhận được ít nhất 4 cách khác nhau để thực hiện điều này):

library(plyr) 
ddply(df1,.(X),transform,Y.New = mean(Y)) 
    X Y Y.New 
1 A 1  2 
2 A 2  2 
3 A 3  2 
4 B 4  5 
5 B 5  5 
6 B 6  5 
4

Joran trả lời đẹp, Đây không phải là một câu trả lời cho câu hỏi của bạn, nhưng phần mở rộng của cuộc trò chuyện. Nếu bạn đang tìm kiếm bảng phương tiện cho mối quan hệ hai phạm trù biến của một phụ thuộc ở đây là chức năng Hadley cho rằng:

cast(CO2, Type ~ Treatment, value="uptake", fun.aggregate=mean, margins=TRUE) 

Dưới đây là một cái nhìn trưởng dữ liệu CO2, và xem xét các phương tiện bảng:

> head(CO2) 
    Plant Type Treatment conc uptake 
1 Qn1 Quebec nonchilled 95 16.0 
2 Qn1 Quebec nonchilled 175 30.4 
3 Qn1 Quebec nonchilled 250 34.8 
4 Qn1 Quebec nonchilled 350 37.2 
5 Qn1 Quebec nonchilled 500 35.3 
6 Qn1 Quebec nonchilled 675 39.2 

> library(reshape) 

> cast(CO2, Type ~ Treatment, mean, margins=TRUE) 
     Type nonchilled chilled (all) 
1  Quebec 35.33333 31.75238 33.54286 
2 Mississippi 25.95238 15.81429 20.88333 
3  (all) 30.64286 23.78333 27.21310 
9

Hai cách khác để làm điều này:

1. với dplyr gói:

library(dplyr) 
df1 <- df1 %>% 
    group_by(X) %>% 
    mutate(Y.new = mean(Y)) 

2. với gói data.table:

library(data.table) 
setDT(df1)[, Y.new := mean(Y), by = X] 

cả cung cấp cho các kết quả sau:

> df1 
    X Y Y.new 
1: A 1  2 
2: A 2  2 
3: A 3  2 
4: B 4  5 
5: B 5  5 
6: B 6  5 
Các vấn đề liên quan