我有一个问题,希望不会成为高级R用户的巨大障碍......
test.data <- data.frame(case = c(1, 1, 1, 2, 2, 2, 3),
year = c(2006, 2007, 2008, 2007, 2006, 2008, 2006),
level = c(10, 20, 20, 12, 20, 20, 20))
Run Code Online (Sandbox Code Playgroud)
正如您可能看到的那样,每个案例都有多次出现,以年份为特征.级别的值在一个案例中不同,我想通过将级别的每个值设置为给定案例的最小级别来纠正它.在这个例子中,每个值水平为= 1时应该是10,并且每个值级别 = 2应该是12.对于我可以做以下的任何特定情况下的情况:
test.data$level[test.data$case==1] <- min(test.data$level[test.data$case==1])
Run Code Online (Sandbox Code Playgroud)
但由于我有几百个案例,这需要很长时间.因此,我想问一下你是否有更快的解决方案.
我有一个关于矢量"分裂"的问题,尽管不同的方法可能是可行的.我有一个data.frame(df),看起来像这样(简化版):
case time
1 1 5
2 2 3
3 3 4
Run Code Online (Sandbox Code Playgroud)
"时间"变量计算事件发生前的时间单位(天,周等).我想通过增加行数来扩展数据集,并将"时间""拆分"为长度为1的间隔,从2开始.结果可能如下所示:
case time begin end
1 1 5 2 3
2 1 5 3 4
3 1 5 4 5
4 2 3 2 3
5 3 4 2 3
6 3 4 3 4
Run Code Online (Sandbox Code Playgroud)
显然,我的数据集比这个例子略大.实现这一结果的可行方法是什么?
我有一个开头的想法
df.exp <- df[rep(row.names(df), df$time - 2), 1:2]
Run Code Online (Sandbox Code Playgroud)
为了扩大每个案例的行数,根据时间间隔的数量.基于此,可以以下列方式添加"开始"和"结束"列:
df.exp$begin <- 2:(df.exp$time-1)
Run Code Online (Sandbox Code Playgroud)
但是,我没有成功创建相应的列,因为此命令仅使用第一行来计算(df.exp $ time-1),并且不会自动区分"case".
任何想法将非常感谢!