2012-09-12 50 views
9

Tôi cần lấy giá trị trung bình của một cột (ở đây: điểm) cho các hàng cụ thể (ở đây: năm). Cụ thể, tôi muốn biết điểm trung bình cho ba giai đoạn:Cách lấy cột có nghĩa là chỉ cho các hàng cụ thể?

  • giai đoạn 1: Năm < = 1983
  • giai đoạn 2: năm> = 1984 & năm < = 1990
  • giai đoạn 3: Năm> = 1991

Đây là cấu trúc của dữ liệu của tôi:

country year  score   
Algeria 1980  -1.1201501 
Algeria 1981  -1.0526943 
Algeria 1982  -1.0561565 
Algeria 1983  -1.1274560 
Algeria 1984  -1.1353926 
Algeria 1985  -1.1734330 
Algeria 1986  -1.1327666 
Algeria 1987  -1.1263586 
Algeria 1988  -0.8529455 
Algeria 1989  -0.2930265 
Algeria 1990  -0.1564207 
Algeria 1991  -0.1526328 
Algeria 1992  -0.9757842 
Algeria 1993  -0.9714060 
Algeria 1994  -1.1422258 
Algeria 1995  -0.3675797 
... 

Giá trị trung bình được tính phải được thêm vào df trong cột bổ sung ("trung bình"), tức là giá trị trung bình tương tự cho năm của kỳ 1, cho giá trị trung bình 2, v.v.

Đây là cách hiển thị:

country year  score   mean 
Algeria 1980  -1.1201501  -1.089 
Algeria 1981  -1.0526943  -1.089 
Algeria 1982  -1.0561565  -1.089 
Algeria 1983  -1.1274560  -1.089 
Algeria 1984  -1.1353926  -0.839 
Algeria 1985  -1.1734330  -0.839 
Algeria 1986  -1.1327666  -0.839 
Algeria 1987  -1.1263586  -0.839 
Algeria 1988  -0.8529455  -0.839 
Algeria 1989  -0.2930265  -0.839 
Algeria 1990  -0.1564207  -0.839 
... 

Mỗi con đường có thể tôi đã cố gắng có một cách dễ dàng siêu phức tạp - và tôi phải tính điểm trung bình trong thời gian thời gian khác nhau trong hơn 90 quốc gia ...

nhiều nhiều nhờ sự giúp đỡ của bạn!

Trả lời

14
datfrm$mean <- 
    with (datfrm, ave(score, findInterval(year, c(-Inf, 1984, 1991, Inf)), FUN= mean)) 

Câu hỏi tiêu đề hơi khác so với câu hỏi thực và sẽ được trả lời bằng cách sử dụng lập chỉ mục logic. Nếu ai muốn chỉ giá trị trung bình cho một tập hợp con đặc biệt nói year >= 1984 & year <= 1990 nó sẽ được thực hiện thông qua:

mn84_90 <- with(datfrm, mean(score[year >= 1984 & year <= 1990])) 
+0

WOW! Điều này thật nhanh chóng và rất hữu ích. Cảm ơn rất nhiều vì giải pháp siêu thanh lịch này! – TiF

+4

Hàm 'findInterval' cần một đại lý quảng cáo tốt hơn. –

5

Kể từ findInterval đòi hỏi year để được sắp xếp (vì nó là trong ví dụ của bạn) Tôi muốn được cám dỗ sử dụng cut trong trường hợp nó không được sắp xếp [đã được chứng minh là sai, cảm ơn @DWin]. Cho đầy đủ các data.table tương đương (quy mô cho dữ liệu lớn) là:

require(data.table) 
DT = as.data.table(DF) # or just start with a data.table in the first place 

DT[, mean:=mean(score), by=cut(year,c(-Inf,1984,1991,Inf))] 

hoặc findInterval có khả năng nhanh như DWin sử dụng:

DT[, mean:=mean(score), by=findInterval(year,c(-Inf,1984,1991,Inf))] 
+2

Yêu cầu đó về findInterval không chính xác (được xác nhận sau khi kiểm tra), nhưng cảm ơn cho việc cung cấp DT. –

+0

Cảm ơn bạn đã thử nghiệm nó !! – TiF

+1

@DWin. Xin lỗi, tôi đã nhầm lẫn 'vec' và' x'. Bạn đúng. –

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