2017-07-13 24 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 
相关问题