10

要素を含む data.frame をシーケンスに返す関数を適用するにはどうすればよいですか?

例:

s <- factor(c(10, 20, 30))
t <- factor(c("a", "b", "a"))
v <- c(5, 6, 4)

df <- data.frame(s,t,v)

したがって、data.frame df は次のとおりです。

   s t v
1 10 a 5
2 20 b 6
3 30 a 4

また、data.frame を返す関数もあります。

simpleFunc2 <- function(df, x){
  tmp <- subset(df, df$s == x)
  return(tmp)
}

今、私はシーケンスを持っています

x <- c(20, 30, 10, 30, 10)

そして、このシーケンスに関数 simpleFunc2 を適用して結果を取得したいと考えています。

私はサプリを使っています

sapply(x, function(x) simpleFunc2(df, x))

しかし、私は得る

  [,1]     [,2]     [,3]     [,4]     [,5]    
s factor,1 factor,1 factor,1 factor,1 factor,1
t factor,1 factor,1 factor,1 factor,1 factor,1
v 6        4        5        4        5  

因子の正しい値を取得するにはどうすればよいですか?

この例は単純化されています。したがって、この場合はもっと簡単な方法があるかもしれません。

4

3 に答える 3

17

lapply代わりに次のように試してくださいdo.call:

do.call(rbind, lapply(x, function(x) simpleFunc2(df=df, x)))
于 2013-01-06T19:56:39.210 に答える
5

質問に対する回答が得られたようですが、そのデータフレームからスーパーセットを選択するアプローチが複雑すぎたと思います。(そして、その関数が代表的ではなかった場合はお詫びします。通過するよりも高速な抽出方法を提供したいと思いますsubset:

> df[ match(x, df$s), ]
     s t v
2   20 b 6
3   30 a 4
1   10 a 5
3.1 30 a 4
1.1 10 a 5
# Save results as from:
> do.call(rbind, lapply(x, function(x) simpleFunc2(df, x)) )
    s t v
2  20 b 6
3  30 a 4
31 10 a 5
32 30 a 4
5  10 a 5
于 2013-01-06T22:02:20.377 に答える
0

私は質問をよく理解していませんが、両方の答えは、少なくとも1つの簡単な方法がこれまで欠落していたことを示唆しています. 入力すると便利な場合が多い

merge(df,as.data.frame(x),by=1)

正しい行/列名でソートされた出力を取得する

   s t v
1 10 a 5
2 10 a 5
3 20 b 6
4 30 a 4
5 30 a 4

パフォーマンスの点では、提案された方法は「一致」を使用する方法と競合することはできませんが、受け入れられた回答では簡単に方法を打ち負かします。

   microbenchmark::microbenchmark(
 do.call=do.call(rbind, lapply(x, function(x) simpleFunc2(df, x))),
 match=df[match(x, df$s), ],
 merge= merge(df,as.data.frame(x),by=1))

.

Unit: microseconds
    expr      min       lq    median        uq      max neval
 do.call 2487.451 2523.033 2547.4060 2604.3850 9554.748   100
   match  175.117  180.197  183.2465  187.8135  248.835   100
   merge 1020.307 1035.062 1049.4835 1071.6575 8057.059   100
于 2013-10-03T12:13:07.667 に答える