2017-06-17 47 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 

我想什麼:(選擇1中第一次出現一組(SID)內爲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

這裏是dplyr方式,使用group_by

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

This Works!非常感謝!!什麼是'。'在.I和.N前面代表? –

+0

@ a.zhu如果你在談論逗號'','data.table的標準格式是'i,j,by'。這裏'i'即行的邏輯索引保持空白 – akrun

相關問題