2015-05-13 17 views
5

Tôi có một khung dữ liệu với hai cột. Tôi muốn thêm hai cột bổ sung vào tập dữ liệu với số lượng dựa trên tổng hợp.Tổng hợp trong R

df <- structure(list(ID = c(1045937900, 1045937900), 
SMS.Type = c("DF1", "WCB14"), 
SMS.Date = c("12/02/2015 19:51", "13/02/2015 08:38"), 
Reply.Date = c("", "13/02/2015 09:52") 
), row.names = 4286:4287, class = "data.frame") 

Tôi chỉ muốn đếm số lượng Instances of SMS.Type và Reply.Date khi không có giá trị rỗng. Vì vậy, trong ví dụ đồ chơi dưới đây, tôi sẽ tạo ra 2 cho SMS.Type và 1 cho Reply.Date

Tôi sau đó muốn thêm điều này vào khung dữ liệu dưới dạng tổng số (Im biết rằng chúng sẽ trùng lặp cho số lượng hàng trong các tập dữ liệu ban đầu nhưng thats ok)

tôi đã được chơi đùa với tổng và đếm chức năng nhưng không có kết quả

mytempdf <-aggregate(cbind(testtrain$SMS.Type,testtrain$Response.option)~testtrain$ID, 
        train, 
        function(x) length(unique(which(!is.na(x))))) 

mytempdf <- aggregate(testtrain$Reply.Date~testtrain$ID, 
        testtrain, 
        function(x) length(which(!is.na(x)))) 

bất cứ ai có thể giúp đỡ?

Cảm ơn bạn đã dành thời gian

Trả lời

5

Sử dụng data.table bạn có thể làm (Tôi đã thêm một thực NA số liệu ban đầu của bạn). Tôi cũng không chắc chắn liệu bạn có thực sự tìm kiếm length(unique()) hoặc chỉ length?

library(data.table) 
cols <- c("SMS.Type", "Reply.Date") 
setDT(df)[, paste0(cols, ".count") := 
        lapply(.SD, function(x) length(unique(na.omit(x)))), 
        .SDcols = cols, 
      by = ID] 
#   ID SMS.Type   SMS.Date  Reply.Date SMS.Type.count Reply.Date.count 
# 1: 1045937900  DF1 12/02/2015 19:51    NA    2    1 
# 2: 1045937900 WCB14 13/02/2015 08:38 13/02/2015 09:52    2    1 

Trong phiên bản devel (v> = 1.9.5), bạn cũng có thể sử dụng chức năng uniqueN


Giải thích

Đây là một giải pháp chung mà sẽ làm việc trên bất kỳ số cột mong muốn. Tất cả những gì bạn cần làm là đặt các tên cột vào cols.

  1. lapply(.SD, đang kêu gọi một chức năng nhất định trên các cột quy định tại .SDcols = cols
  2. paste0(cols, ".count") tạo tên cột mới trong khi thêm count với tên cột được chỉ định trong cols
  3. := Thực hiện nhượng bằng cách tham khảo, ý nghĩa, cập nhật các cột mới được tạo có đầu ra là lapply(.SD,tại vị trí
  4. by luận được quy định cụ thể các cột aggregator
+0

Hi David, Cảm ơn bạn giới thiệu tôi đến data.table ... Bạn có thể giải thích những gì mỗi dòng được làm từ SetDT trở đi nếu bạn có thời gian. Để trả lời câu hỏi của bạn, tôi đã sử dụng độ dài (unique()) để thử và đếm các giá trị duy nhất trong các cột –

+0

Tôi đã thêm giải thích. –

+1

Cảm ơn bạn rất nhiều vì câu trả lời của bạn –

1

Sau khi chuyển đổi chuỗi rỗng của bạn để NA:

library(dplyr) 
mutate(df, SMS.Type.count = sum(!is.na(SMS.Type)), 
      Reply.Date.count = sum(!is.na(Reply.Date))) 
+1

OP muốn đếm các mục nhập duy nhất. –

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