2011-09-26 81 views
8

Tôi biết có một cách dễ dàng để thực hiện việc này ... nhưng, tôi không thể hiểu được.Dữ liệu tổng hợp trong một cột dựa trên các giá trị trong một cột khác

Tôi có một dataframe trong kịch bản R của tôi trông giống như thế này:

A  B C 
1.2 4 8 
2.3 4 9 
2.3 6 0 
1.2 3 3 
3.4 2 1 
1.2 5 1 

Lưu ý rằng A, B, và C là tên cột. Và tôi đang cố gắng nhận các biến như sau:

sum1 <- [the sum of all B values such that A is 1.2] 
num1 <- [the number of times A is 1.2] 

Bất kỳ cách nào dễ dàng để thực hiện việc này? tôi về cơ bản muốn kết thúc với một khung dữ liệu mà trông như thế này:

A  num  totalB 
    1.2 3  12 
    etc etc  etc 

đâu "num" là số lần mà đặc biệt Một giá trị xuất hiện, và "totalB" là tổng của các giá trị B cho giá trị A.

Trả lời

13

Tôi muốn sử dụng aggregate để có được hai uẩn và sau đó merge chúng vào một khung dữ liệu duy nhất:

> df 
    A B C 
1 1.2 4 8 
2 2.3 4 9 
3 2.3 6 0 
4 1.2 3 3 
5 3.4 2 1 
6 1.2 5 1 

> num <- aggregate(B~A,df,length) 
> names(num)[2] <- 'num' 

> totalB <- aggregate(B~A,df,sum) 
> names(totalB)[2] <- 'totalB' 

> merge(num,totalB) 
    A num totalB 
1 1.2 3  12 
2 2.3 2  10 
3 3.4 1  2 
+0

trong tổng hợp, nó chỉ sử dụng tất cả các hàng trong khung dữ liệu của tôi. nếu tôi muốn nói chỉ tổng hợp cho một hàng cụ thể với một điều kiện cụ thể (ví dụ: c == 1) – CodeGuy

+0

@CodeGuy: Chỉ cần 'tập hợp con', ví dụ: 'tổng hợp (B ~ A, tập con (df, C == 1), tổng)' – NPE

4

Đây là một giải pháp sử dụng các plyr gói

plyr::ddply(df, .(A), summarize, num = length(A), totalB = sum(B)) 
4

Dưới đây là một giải pháp sử dụng data.table để nhớ và hiệu quả thời gian

library(data.table) 
DT <- as.data.table(df) 
DT[, list(totalB = sum(B), num = .N), by = A] 

Để tập hợp con chỉ hàng nơi C==1 (theo bình luận cho câu trả lời @aix)

DT[C==1, list(totalB = sum(B), num = .N), by = A] 
1

Trong dplyr:

library(tidyverse) 
A <- c(1.2, 2.3, 2.3, 1.2, 3.4, 1.2) 
B <- c(4, 4, 6, 3, 2, 5) 
C <- c(8, 9, 0, 3, 1, 1) 

df <- data_frame(A, B, C) 

df %>% 
    group_by(A) %>% 
    summarise(num = n(), 
       totalB = sum(B)) 
Các vấn đề liên quan