1

私は自分のデータの小さな例を作りました:

mth <- c(rep(1,10))  
day <- c(rep(10,5),rep(11,5))  
hr <- c(3,4,5,6,7,3,4,5,6,7)  
v <- c(3,4,5,4,3,3,4,5,4,3)  
A <- data.frame(cbind(mth,day,hr,v)) 

私がする必要があるのは、毎日いくつの値 < 4 を取得することです。関数を使用しようとしましたrleが、必要なものを取得できませんでした。出力は次のようになります。

mth <- c(rep(1,2))  
day <- c(10,11)  
v <- c(2,2)  #each 2 here is the sum of 1(3)+1(3) for Oct. and Nov.  
A <- data.frame(cbind(mth,day,v))  

ご協力ありがとうございました!

4

4 に答える 4

3

これが基本的な解決策tapplyです:

> with(A, tapply(v, paste(mth,day, sep="_"), function(x) sum(x<4) ) )
1_10 1_11 
   2    2 

(そして、それはplyrソリューションよりもはるかに高速になりますが、ほとんどの場合、data.tableアプローチに次ぐものになります。)

于 2012-08-17T00:07:43.653 に答える
2

解決data.table

library(data.table)
A <- data.table(A)
A[, sum(v < 4), by = list(mth,day)]

##    mth day V1
## 1:   1  10 2
## 2:   1  11 2

# or 

A[v<4, .N, by = list(mth,day)]

##    mth day N
## 1:   1  10 2
## 2:   1  11 2

ベンチマーク

# I create a mock dataset of a `year` 

library(rbenchmark)
daily <- seq(as.Date("2000/1/1"), by="day", length.out=365)

A <- data.table(mth = month(daily),day = mday(daily))
A <-  A[, list(hr = 1:24), by = list(mth,day)]
A[['v']] <- sample(1:10, nrow(A), T)

# set up the various options
ddply1 <- function() ddply(A, .(mth, day), function(x)  sum(x$v<4))
ddply2 <- function() ddply(A, .(mth, day), summarize, less4 = sum(v <4))
base_tapply <- function() with(A, tapply(v, paste(mth,day, sep="_"), function(x) sum(x<4) ) )
dt1 <- function() A[, sum(v < 4), by = list(mth,day)]
dt2 <- function() A[v < 4, .N, by = list(mth,day)]  
sqldf_ <- function() sqldf("SELECT A.mth,A.day,sum(A.v<4) as sum FROM A GROUP BY day")

benchmark(ddply1(), ddply2(),base_tapply(),dt1(),dt2(), sqldf_(),
          replications = 5, 
          columns = c("test", "replications", "elapsed", "relative","user.self"))

##            test replications elapsed relative user.self
## 3 base_tapply()            5    0.08        8      0.08
## 1      ddply1()            5    0.72       72      0.72
## 2      ddply2()            5    1.04      104      1.03
## 4         dt1()            5    0.01        1      0.02
## 5         dt2()            5    0.00        0      0.00
## 6      sqldf_()            5    0.21       21      0.20
于 2012-08-17T00:06:44.330 に答える
2

ddply を使えば簡単です

library(plyr)
ddply(A, .(mth, day), function(x)  sum(x$v<4))
#    mth day V1
# 1   1  10  2
# 2   1  11  2

またはあなたが使用することができますsummarize

ddply(A, .(mth, day), summarize, less4 = sum(v <4))
#   mth day less4
# 1   1  10  2
# 2   1  11  2
于 2012-08-16T23:53:04.977 に答える
1

sqldf

library(sqldf)

sqldf("SELECT A.mth,A.day,sum(A.v<4) as sum FROM A GROUP BY day")
#  mth day sum
#1   1  10   2
#2   1  11   2
于 2012-08-17T00:15:01.790 に答える