-1

data.tableのいくつかのグループに対して複数の列を返そうとしています。関数を使用して値のリストを分離し、各グループのベクトルを計算します。このようなテーブルにこれらの値を返したいのですが

address1, time1, value1
address1, time2, value2
address1, time3, value3

関数でtime1-time2をグループ化し、次のようなものを返したい

address1,sum(value1),       mean(value1)                     (by timegr1)
address1,sum(value2+value3),mean(value2+value3)              (by timegr2)

私はなんとかすべての値を計算できましたが、結果をフォーマットできませんでした。そのため、2つの時間グループを異なる行に配置し、合計と平均を同じ行に保持しました。

ここで編集するのはコードです:

v <- data.table(address =c(1,1,1,1),time=c(1,50,51,52),value=c(1,2,3,4))

fun <- function(time,value) {
data <- data.table(time=time,value=value)
#this split depends on a number of criteria
k <- split(data,c(0,rep(1,nrow(data)-1))) 
k1 <- sapply(k,function(x) c(mean(x$value),sum(x$value)))
return(k1)
}

v1 <- v[,fun(time,value),by=address]

V1はとして出てきます

   address V1
1:       1  1
2:       1  1
3:       1  3
4:       1  9

私は本当に何かが必要です

   address  mean sum
1: 1        1    1
2: 1        3    9

どうもありがとう。

4

3 に答える 3

3

複数の行を返すには、data.table によって適用される関数は、以下の例のように、ベクターまたはベクターのリストを返す必要があります。

library(data.table)

(dat <- data.table(expand.grid(sub=1:4, score=1:4), key="sub"))
#     sub score
#  1:   1     1
#  2:   1     2
#  3:   1     3
#  4:   1     4
#  5:   2     1
#  6:   2     2
#  7:   2     3
#  8:   2     4
#  9:   3     1
# 10:   3     2
# 11:   3     3
# 12:   3     4
# 13:   4     1
# 14:   4     2
# 15:   4     3
# 16:   4     4

dat[,list(stat=c("mean","sd"), value=c(mean(score),sd(score))),by=sub]
#    sub stat    value
# 1:   1 mean 2.500000
# 2:   1   sd 1.290994
# 3:   2 mean 2.500000
# 4:   2   sd 1.290994
# 5:   3 mean 2.500000
# 6:   3   sd 1.290994
# 7:   4 mean 2.500000
# 8:   4   sd 1.290994
于 2012-11-05T19:25:08.370 に答える
1

私はこれを2つのステップでしか達成できませんでした

fun <- function(x) {
    c(0,rep(1,length(x)-1)) 
}

v <- data.table(address =c(1,1,1,1),time=c(1,50,51,52),value=c(1,2,3,4))

v1 <- v[,group:=fun(time),by=address]

v2 <- v1[,list(mean=mean(value),sum=sum(value)),by=list(address,group)]

   address group mean sum
1:       1     0    1   1
2:       1     1    3   9
于 2012-11-07T00:13:54.017 に答える