5

関数の適用について少し質問があります。たとえば、私は持っています:

l <- list(a = data.frame(A1=rep(10,5),B1=c(1,1,1,2,2),C1=c(5,10,20,7,30)),
          b = data.frame(A1=rep(20,5),B1=c(3,3,4,4,4),C1=c(3,5,10,20,30)))

B1ごとに最小のC1を見つけたい。結果は次のようになります

$a
  A1 B1 C1
  10  1  5
  10  2  7

$b
  A1 B1 C1
  20  3  3
  20  4  10

'for'でそれを行う方法を知っていますが、'lapply'でより簡単な方法である必要がありますが、それを機能させることができませんでした。

助けてください

4

4 に答える 4

4

組み合わせlapplytapply

lapply(l, function(i) tapply(i$C1, i$B1, min))
$a
1 2 
5 7 

$b
3  4 
3 10 

複数の操作について考える秘訣は、タスクをビットに分割することです。それで、

  1. C1各の最小B1単一のデータフレームに対してこれをどのように行うのですか?

    i = l[[1]]
    tapply(i$C1, i$B1, min)
    
  2. リストの各要素?使用するだけlapplyです:

    lapply(l, function(i) tapply(i$C1, i$B1, min))
    

手順1を実行できない場合、手順2を管理することはできません。

于 2013-02-12T10:00:39.020 に答える
3

data.table最近、パッケージのサイレンの歌と、このような操作を行うための汎用性と速度の組み合わせに屈したので、私はさらに別の解決策を提出します:

library(data.table)
lapply(l, function(dat) {
    data.table(dat, key="B1,C1")[list(unique(B1)), mult="first"]
})

元の列の順序を保持することが重要な場合は、何らかの理由で、data.table()呼び出しがでラップされる可能性がありますsetcolorder(..., names(dat))

于 2013-03-03T23:44:00.247 に答える
2

目的の出力に一致する別のアプローチは次のとおりです。

lapply(l, function(x) {
  temp <- ave(x[["C1"]], x["B1"], FUN = min)
  x[x[["C1"]] == temp, ]
})
# $a
#   A1 B1 C1
# 1 10  1  5
# 4 10  2  7
# 
# $b
#   A1 B1 C1
# 1 20  3  3
# 3 20  4 10
于 2013-02-12T12:15:40.590 に答える
0

plyr/reshape2ツールボックスからllply+dcastを試すこともできます。

library(reshape2)
library(plyr)

    l <- list(a = data.frame(A1=rep(10,5),B1=c(1,1,1,2,2),C1=c(5,10,20,7,30)),
              b = data.frame(A1=rep(20,5),B1=c(3,3,4,4,4),C1=c(3,5,10,20,30)))

    llply(l, function (x) {dcast (x, A1+B1~., value.var="C1", min)})
于 2013-03-03T22:09:18.757 に答える