2017-06-17 1 views
1

現在、被験者が最初にRのNaNに青いキューを選択する行を作成しようとしています。最初のNaNでグループ(対象グループ)内の値が発生していませんか?私は、次の操作を実行しようとした:グループ内のNaNに最初に出現する数字を作る方法

replacefirsts<-function(x) 
{ 
    dataless[match(unique(dataless$choice==1),dataless$choice),]==NaN; 
} 
data=tapply(data$sID,list(data$sID),replacefirsts) 

私はこれを行うと、それは新しいデータセットのみがNaN値ではなく、行の残りの部分を持っています。

現在、私のデータは次のようになります。

sID choice 
1  2 
1  1 
1  3 
1  1 
1  1 
2  1 
2  2 
2  2 
2  3 
2  3 
3  3 
3  1 
3  2 
3  2 
3  2 

私が望む何を:(グループ(SID)内の選択肢1の最初の発生がNaNである:ここでは

sID choice 
1  2 
1  NaN 
1  3 
1  1 
1  1 
2  NaN 
2  2 
2  1 
2  3 
2  3 
3  3 
3  NaN 
3  2 
3  2 
3  2 

答えて

2

は方法です基地Rを介して、ここ

with(df, ave(choice, sID, FUN = function(i) replace(i, which(i == 1)[1], NaN))) 
#[1] 2 NaN 3 1 1 NaN 2 2 3 3 3 NaN 2 2 2 
+1

これは完璧に動作して持つ一つの選択肢です。本当にありがとう!! (遅く返事して申し訳ありません) –

+0

[1]は何を表していますか? –

+0

最初の観察 – Sotos

1

group_by

を使用して、dplyrの方法でありますここで
dat <- data.frame(sID = rep(1:3, each=3), choice = c(1,2,1,1,2,3,3,1,1)) 

dat %>% 
    group_by(sID) %>% 
    mutate(choice2 = ifelse((choice == 1 & !duplicated(choice == 1)), NaN, choice)) 

Source: local data frame [9 x 3] 
Groups: sID [3] 

    sID choice choice2 
    <int> <dbl> <dbl> 
1  1  1  NaN 
2  1  2  2 
3  1  1  1 
4  2  1  NaN 
5  2  2  2 
6  2  3  3 
7  3  3  3 
8  3  1  NaN 
9  3  1  1 
+0

これは素晴らしいことです!できます!あなたの助けをありがとう!返事が遅れて申し訳ありません! –

1

data.table

library(data.table) 
setDT(df)[df[, .I[seq_len(.N) == 1 & choice == 1],.(choice, sID)]$V1, choice := NaN][] 
# sID choice 
# 1: 1  2 
# 2: 1 NaN 
# 3: 1  3 
# 4: 1  1 
# 5: 1  1 
# 6: 2 NaN 
# 7: 2  2 
# 8: 2  2 
# 9: 2  3 
#10: 2  3 
#11: 3  3 
#12: 3 NaN 
#13: 3  2 
#14: 3  2 
#15: 3  2 

それともbase R

with(df, NaN^(!duplicated(df) & choice == 1)*choice) 
#[1] 2 NaN 3 1 1 NaN 2 2 3 3 3 NaN 2 2 2 
+0

これは機能します!本当にありがとう!!何が '。' .Iと.Nの前に? –

+0

@ a.zhuコンマ '、'について話しているのであれば、data.tableの標準フォーマットは 'i、j、by'です。ここでは、行の論理インデックス 'i'は空白にします – akrun

関連する問題