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

相关问题