首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中,如何根据前面(或后面)行中的更改来设置变量的值?

在R中,如何根据前面(或后面)行中的更改来设置变量的值?
EN

Stack Overflow用户
提问于 2014-02-18 22:44:46
回答 1查看 245关注 0票数 3

给出了如下数据框架:

代码语言:javascript
运行
复制
id<-c(1,1,1,1,1,1,2,2,2,2,2,2)
t<-c(6,8,9,11,12,14,55,57,58,60,62,63)
p<-c("a","a","a","b","b","b","a","a","b","b","b","b")
df<-data.frame(id,t,p)

row id  t   p
1   1   6   a
2   1   8   a
3   1   9   a
4   1   11  b
5   1   12  b
6   1   14  b
7   2   55  a
8   2   57  a
9   2   58  b
10  2   60  b
11  2   62  b
12  2   63  b

我想创建一个新的变量' ta‘,这样ta的值是:

  1. 对于对于给定ID (第4行和第9行)“p”从a到b的行来说为零(我可以这样做)
  2. 在每个唯一的id中,当p是'a‘时,ta的值应该从零开始,由所讨论的行和它上面的行之间的t的变化来计算。例如,对于第3行,ta的值应该是0- (11-9) = -2。
  3. 在每个唯一的id中,当p是'b‘时,ta的值应该从零开始,由所讨论的行和它下面的行之间的t的变化来计算。例如,对于第5行,ta的值应该是0+ (12-11) = 1。

因此,数据框架完成后应如下所示:

代码语言:javascript
运行
复制
row id  t   p   ta
1   1   6   a   -5
2   1   8   a   -3
3   1   9   a   -2
4   1   11  b   0
5   1   12  b   1
6   1   14  b   3
7   2   55  a   -3
8   2   57  a   -1
9   2   58  b   0
10  2   60  b   2
11  2   62  b   4
12  2   63  b   5

我一直在玩循环和累计()、头()和尾(),并且无法使这类id/在条件求和中工作。关于如何处理前一行或下一行中的值,还有许多其他问题,但我不能完全改变这些技术中的任何一种。非常感谢你的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 23:11:13

这就是你要的。这是一种拆分应用-结合策略,通过id分解所有东西,建立p=='a'p=='b'之间的过渡点,然后减去高于和低于该值的值。只有当你的数据按你在这里显示的方式排序时,它才能起作用。

代码语言:javascript
运行
复制
do.call('rbind',
lapply(split(df, id), function(x) {
    # save values of `0` at transition points in `p`
    x <- cbind.data.frame(x, ta=ifelse(c(0,diff(as.numeric(as.factor(x$p))))==1, 0, NA))

    # identify indices for those points
    w <- which(x$ta==0)

    # handle `ta` values for `p=='b'`
    x$ta[(w+1):nrow(x)] <- x$ta[w] + (x$t[(w+1):nrow(x)] - x$t[w])

    # handle `ta` values for `p=='a'`
    x$ta[1:(w-1)] <- x$ta[w] - (x$t[w] - x$t[1:(w-1)])

    return(x)
})
)

结果:

代码语言:javascript
运行
复制
     id  t p ta
1.1   1  6 a -5
1.2   1  8 a -3
1.3   1  9 a -2
1.4   1 11 b  0
1.5   1 12 b  1
1.6   1 14 b  3
2.7   2 55 a -3
2.8   2 57 a -1
2.9   2 58 b  0
2.10  2 60 b  2
2.11  2 62 b  4
2.12  2 63 b  5
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21867109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档