2011-11-16 31 views
11

Làm cách nào để chọn hàng đầu tiên của khung dữ liệu R đáp ứng các tiêu chí nhất định?Làm cách nào để chọn hàng đầu tiên trong khung dữ liệu R đáp ứng các tiêu chí nhất định?

Đây là bối cảnh:

Tôi có một khung dữ liệu với năm cột:

"pixel", "year","propvar", "component", "cumsum." 

Có 1225 kết hợp của pixelyear, vì dữ liệu đã được tính toán từ các chuỗi thời gian hàng năm của 49 điểm ảnh địa lý cho mỗi 25 năm nghiên cứu. Trong mỗi năm điểm ảnh, tôi đã tính toán propvar, tỷ lệ phương sai tổng được giải thích bởi một thành phần nhất định của phép biến đổi Fourier nhanh cho chuỗi thời gian của một năm pixel nhất định. Sau đó tôi tính được cumsum, là tổng tích luỹ của propvar cho từng thành phần tần suất trong một năm pixel. Cột component chỉ cung cấp cho bạn chỉ mục cho thành phần chuỗi Fourier (cộng 1) mà từ đó propvar được tính toán.

Tôi muốn xác định số lượng thành phần cần thiết để giải thích lớn hơn 99% phương sai. Tôi tìm một cách để thực hiện việc này là tìm hàng đầu tiên trong mỗi năm pixel trong đó cumsum> 0,99 và tạo khung dữ liệu từ đó với ba cột, pixel, yearnumbercomps, trong đó numbercomps là số lượng thành phần bắt buộc trong một năm pixel nhất định để giải thích lớn hơn 99% phương sai. Tôi không biết làm thế nào để làm điều này trong R. Có ai có một giải pháp?

Trả lời

19

Chắc chắn. Một cái gì đó như thế này nên làm như lừa:

# CREATE A REPRODUCIBLE EXAMPLE! 
df <- data.frame(year = c("2001", "2003", "2001", "2003", "2003"), 
       pixel = c("a", "b", "a", "b", "a"), 
       cumsum = c(99, 99, 98, 99, 99), 
       numbercomps=1:5) 
df 
# year pixel cumsum numbercomps 
# 1 2001  a  99   1 
# 2 2003  b  99   2 
# 3 2001  a  98   3 
# 4 2003  b  99   4 
# 5 2003  a  99   5 

# EXTRACT THE SUBSET YOU'D LIKE. 
res <- subset(df, cumsum>=99) 
res <- subset(res, 
       subset = !duplicated(res[c("year", "pixel")]), 
       select = c("pixel", "year", "numbercomps")) 
# pixel year numbercomps 
# 1  a 2001   1 
# 2  b 2003   2 
# 5  a 2003   5 

EDIT Ngoài ra, đối với những quan tâm data.table, có là thế này:

library(data.table) 
dt <- data.table(df, key="pixel, year")  
dt[cumsum>=99, .SD[1], by=key(dt)] 
+3

Thánh tào lao. Bây giờ tôi biết lý do tại sao bạn đã tăng 2,157 điểm chỉ trong 43 ngày thành viên StackOverflow. Cảm ơn, người đàn ông! Tôi có phản hồi này trong thư mục StackOverflow của ứng dụng email của tôi. Tôi sẽ thừa nhận bạn trong bất kỳ ấn phẩm nào xuất phát từ sự hỗ trợ này. Tôi yêu các chức năng trùng lặp, BTW. Nó giống như ... chính xác những gì tôi cần. (BTW, các ấn phẩm sẽ, tất nhiên, là kết quả của nhiều công việc hơn là vấn đề đặc biệt này, LOL.) Chúc một đêm ngon lành. –

+0

Tuyệt. Đừng gửi cho tôi một bản sao của bất kỳ quán rượu nào đến từ dự án (mặc dù không có sự thừa nhận nào cần thiết)! –

+0

Sẽ làm! Và tôi đã kiểm tra câu trả lời của bạn. Cảm ơn một lần nữa. –

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