2016-10-10 7 views
2

私はforループの初心者ですので、この質問にはすでに明確な答えがある場合はお詫びしますが、この特定の質問にどのように適用するかを理解できたものは何も見つかりませんでした。私も最終的にdplyrの実装を試み始めましたが、それも分かりませんでした。3つの別々の列Rまたはdplyr/reshapeソリューションに書き込む関数を持つforループ?

ここに私の質問です:ベクトルから3つの値を派生させる関数があります。これらの3つの値を新しい列と同じdfに書きたいと思います。私は全体のDFで、それを実行すると機能がR. でretimesライブラリからtimefitです:

a1 <- timefit(data$RT) 
    a1: 
     mu: 480.3346 
    sigma: 77.8531 
     tau: 376.7426 

私はDF df <- data.frame([email protected])に値を配置する場合:

 a1.par 
mu 480.33462 
sigma 77.85305 
tau 376.74257 

私がしたいです別の変数 "location"(2つのレベルを持つ要素)に基づいて、各subIDに対して個別に実行することができます。私は

subID location mu sigma tau 
1  0  500 50 400 
1  0  500 50 400 
1  1  376 50 410 
1  1  376 50 410 
2  0  400 60 400 
2  0  400 60 400 
2  1  410 60 410 
2  1  410 60 410 

のようなもので終わるように、私は

for (subID in data) { 
    timefit(data$RT) 
} 

で始まったしかし、私はそれは実際に私はそれが何をする必要があるかどうするつもりはないことを知っています。値は、@parでtimefitモデルから長い形式に抽出されるので、3つの別々の列ヘッダーに書き込む関数timefitを指定する必要がありますか?助言がありますか?

また、私はddplyを使うことを考えましたが、最後の行はフォーマットが長いので私を引きつけていますが、私はそれを広くする必要があります。私はリシェイプビットで混乱しましたが、私はあなたの助けのための

data <- data %>% 
    group_by(subID, location) %>% 
    mutate(timefit_out = timefit(RT)) 

おかげ

それを考え出すのトラブルを抱えています!

答えて

1

をここは、各(subID, location)timefitからdata.frameを含むリスト列を生成します。これらのデータフレームは、列としてtimefitの結果からmusigma、及びtauをコードします。次に、unnestを使用してこのリスト列をネスト解除して、必要な結果を生成します。我々はtimefitクラスから"par"属性を抽出してmusigma、およびtauの列を形成するためにtでそれを転置

library(retimes) 
library(dplyr) 
library(tidyr) 
result <- data %>% group_by(subID, location) %>% 
        summarise(timefit_out = list(data.frame(t(attr(timefit(RT),"par"))))) %>% 
        unnest() 

注意。ここで

は、我々はあなたの入力dataが列subIDlocationとのデータフレーム、およびtimefitに入力され、反応時間RTの数値列であることを前提としています。この例ではRTの値はrunifはそれらが01の間で使用して生成される

data <- structure(list(subID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
location = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
RT = c(0.341764254728332, 0.775535081513226, 0.281827432336286, 
0.23970171622932, 0.00226009078323841, 0.385179498931393, 
0.645917195128277, 0.812101020244882, 0.183301427634433, 
0.981765420176089, 0.656369511503726, 0.824469136772677, 
0.923240559641272, 0.598261737963185, 0.309975759591907, 
0.778991278028116, 0.757012664806098, 0.869985132943839, 
0.439378245733678, 0.8420404586941, 0.643788777757436, 0.381316626211628, 
0.123881611274555, 0.540528740268201, 0.661961955949664, 
0.0592848095111549, 0.904047027230263, 0.190083365887403, 
0.963809312786907, 0.0925120878964663, 0.117538752267137, 
0.451085010776296, 0.703220259631053, 0.378451474476606, 
0.305718191433698, 0.70383172808215, 0.699415655340999, 0.740436099236831, 
0.429179352009669, 0.205358384409919)), .Names = c("subID", 
"location", "RT"), row.names = c(NA, 40L), class = "data.frame") 
## subID location   RT 
##1  1  0 0.341764255 
##2  1  0 0.775535082 
##3  1  0 0.281827432 
##4  1  0 0.239701716 
##5  1  0 0.002260091 
##6  1  0 0.385179499 
##7  1  0 0.645917195 
##8  1  0 0.812101020 
##9  1  0 0.183301428 
##10  1  0 0.981765420 
##11  1  1 0.656369512 
##12  1  1 0.824469137 
##13  1  1 0.923240560 
##14  1  1 0.598261738 
##15  1  1 0.309975760 
##16  1  1 0.778991278 
##17  1  1 0.757012665 
##18  1  1 0.869985133 
##19  1  1 0.439378246 
##20  1  1 0.842040459 
##21  2  0 0.643788778 
##22  2  0 0.381316626 
##23  2  0 0.123881611 
##24  2  0 0.540528740 
##25  2  0 0.661961956 
##26  2  0 0.059284810 
##27  2  0 0.904047027 
##28  2  0 0.190083366 
##29  2  0 0.963809313 
##30  2  0 0.092512088 
##31  2  1 0.117538752 
##32  2  1 0.451085011 
##33  2  1 0.703220260 
##34  2  1 0.378451474 
##35  2  1 0.305718191 
##36  2  1 0.703831728 
##37  2  1 0.699415655 
##38  2  1 0.740436099 
##39  2  1 0.429179352 
##40  2  1 0.205358384 

:そのようなデータセットのシミュレートされた例は次式で与えられます。あなたの価値観は大きく異なりますが、ここでは重要ではありません。このデータを使用して

は、我々が得る:

print(result) 
##Source: local data frame [4 x 5] 
##Groups: subID [2] 
## 
## subID location  mu  sigma   tau 
## <int> <int>  <dbl>  <dbl>  <dbl> 
##1  1  0 0.5275058 0.2553621 0.007086207 
##2  1  1 0.2609386 0.1583494 0.085449559 
##3  2  0 0.5205647 0.1994942 0.027329115 
##4  2  1 0.4632886 0.2881343 0.008026460 
+0

グレート、ありがとうございました。また、要約が私のためにマスクされている(正確にはわからない)が、dplyr :: summarizeを指定しなかった場合は、全体の行のみが返されたことを追加したかった。 – Mik

+0

@MikaelRubin:あなたはddply' 'で作業して述べたように理由plyr''のものであってもよいです。 'plyr'と' dplyr'の両方を 'デタッチ 'して' dplyr'をロードすることができます。両方のパッケージが必要な場合は、まず 'plyr'をロードしてから' dplyr'をロードしてください。 – aichao

0

dplyrソリューションをお探しの場合は、doです。それはdata.framesの返品を可能にしますが、少しの操作を必要とするかもしれません。具体的には、(必然的に)行ではなく、グループ全体で動作するように設計されています。だから、あなたが元の情報のいくつか(そして関数の構造に依存して)を返すようにするには、グループを設定する必要があります。このため

、私は単純なデータセットを生成しています:

myData <- 
    data.frame(
    RT = 1:4 
) 

あなたはまた、data.frameとして必要な値を返す関数を作成する必要があります。あなたの使用のために、あなたはおそらく機能にtimefitの結果を計算します、そして返すために列としてそれぞれの値を抽出します。

その後
myFunc <- function(x){ 
    data.frame(a= x + 1, b = x + 2, c = x + 3) 
} 

、あなたがして、別の(そして返す)する列でグループ、およびdoを呼び出します。

この場合には、この返し、
myData %>% 
    group_by(RT) %>% 
    do((myFunc(.$RT))) 

:あなたが代わりに0123のsummariseを使用することができます

 RT  a  b  c 
1  1  2  3  4 
2  2  3  4  5 
3  3  4  5  6 
4  4  5  6  7 
関連する問題