2017-07-13 54 views
0

所以,我想從兩個現有的(數字)信息生成一個新的向量,一個爲參與者設置id,另一個表示觀察值。每個受試者都有不同的觀察時間。sapply函數(x)其中x是子集參數

現在,新的向量應該應該狀態:0當obs_no = 1; 1當obs_no =該id的最後一次觀察; NA之間的情況。

id obs_no new_vector 
1 1  0 
1 2  NA 
1 3  NA 
1 4  NA 
1 5  1 
2 1  0 
2 2  1 
3 1  0 
3 2  NA 
3 3  1 

我想我可以用這樣的

new_vector <- c(0, rep(NA, times=length(obs_no[id==1])-2), 1) 

代碼爲每個ID做到這一點separatly或者我猜只是使用MAX(),但它不會有任何區別。

但是手動添加每個參與者真的很不方便,因爲我有很多情況。我無法弄清楚如何製作一個通用函數。我嘗試使用sapply定義函數(x),但由於x位於子集括號內,因此無法使其工作。

任何建議都會有所幫助。謝謝。

回答

1

ave救援:

dat$newvar <- NA 
dat$newvar <- with(dat, 
    ave(newvar, id, FUN=function(x) replace(x, c(length(x),1), c(1,0))) 
) 

或使用位的duplicated()樂趣:

兩個給:

# id obs_no new_vector newvar 
#1 1  1   0  0 
#2 1  2   NA  NA 
#3 1  3   NA  NA 
#4 1  4   NA  NA 
#5 1  5   1  1 
#6 2  1   0  0 
#7 2  2   1  1 
#8 3  1   0  0 
#9 3  2   NA  NA 
#10 3  3   1  1 
+0

如果一個團體只有一個觀察,那麼任何想法應該是什麼值? – akrun

+0

噢,是的,如果只有一個觀察值應該是0!如果我交換第二行和第三行的順序,「重複」解決方案仍然有效!謝謝! – andreasgoteson

+0

@andreasgoteson - 我已經交換了訂單來解釋這一點 - 現在''ave'版本應該可以工作。 – thelatemail

0

使用split

result = lapply(split(obs_no, id), function (x) c(0, rep(NA, length(x) - 2), 1)) 

這給你向量的列表。你可以將其粘貼到一起是這樣的:

do.call(c, result) 
+0

智能解決方案,謝謝!爲給出的例子工作良好,但以某種方式導致與原始數據錯誤。 「無效'時間'參數」 – andreasgoteson

+0

@andreasgoteson您需要提供更多信息。特別是因爲其他解決方案爲了解決這個問題而走了很多彎路。我猜想有一些你的ID只對他們有一個單一的價值?在這些情況下你想分配什麼? –

+0

正如上面的評論 - 單個值的情況下,應分配值0.對不起,我忘了先說。但上述解決方案解決了我的問題,儘管繞道而行。 – andreasgoteson

1

你也可以做到這一點與dplyr

str <- " 
id obs_no new_vector 
1 1  0 
1 2  NA 
1 3  NA 
1 4  NA 
1 5  1 
2 1  0 
2 2  1 
3 1  0 
3 2  NA 
3 3  1 
" 

dt <- read.table(textConnection(str), header = T) 

library(dplyr) 

dt %>% group_by(id) %>% 
    mutate(newvar = if_else(obs_no==1,0L,if_else(obs_no==max(obs_no),1L,as.integer(NA)))) 
1

我們可以使用data.table

library(data.table) 
i1 <- setDT(df1)[, .I[seq_len(.N) %in% c(1, .N)], id]$V1 
df1[i1, newvar := c(0, 1)] 
df1 
#  id obs_no new_vector newvar 
# 1: 1  1   0  0 
# 2: 1  2   NA  NA 
# 3: 1  3   NA  NA 
# 4: 1  4   NA  NA 
# 5: 1  5   1  1 
# 6: 2  1   0  0 
# 7: 2  2   1  1 
# 8: 3  1   0  0 
# 9: 3  2   NA  NA 
#10: 3  3   1  1 
相關問題