首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“by”和“条件”替换data.table中的行值

使用“by”和“条件”替换data.table中的行值
EN

Stack Overflow用户
提问于 2015-04-23 12:18:59
回答 1查看 1.5K关注 0票数 3

我试图根据另一列中的条件,在分组中替换列中的某些行值。

编辑:编辑以提高问题的递归性质。

例如。

代码语言:javascript
复制
DT = data.table(y=rep(c(1,3), each = 3)
            ,v=as.numeric(c(1,2,4,4,5,8))
            ,x=as.numeric(rep(c(9:11),each=2)),key=c("y","v"))
DT
   y v  x
1: 1 1  9
2: 1 2  9
3: 1 4 10
4: 3 4 10
5: 3 5 11
6: 3 8 11

在每个'y‘中,我想将'x’的值替换为‘x’,其中'v‘有一个观察v+t (例如t= 3),用2222 (实际上是函数的结果)替换为以下结果:

代码语言:javascript
复制
   y v  x
1: 1 1  9
2: 1 2  9
3: 1 4 2222
4: 3 4 10
5: 3 5 11
6: 3 8 2222

我试过以下几种方法,但都没有用。

代码语言:javascript
复制
  DT[which((v-3) %in% v), x:= 2222, y][]

它神秘地(?)在以下方面的成果:

代码语言:javascript
复制
   y v  x
1: 1 1  9
2: 1 2  9
3: 1 4 2222
4: 3 4 2222
5: 3 5 2222
6: 3 8 2222

跑步:

代码语言:javascript
复制
DT[,print(which((v-3) %in% v)), by =y]

指示它在组内执行正确的索引,但我不明白从(或缺少)发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-23 12:22:30

您可以尝试使用replace (它可能有一些开销,因为它复制了整个x)。

代码语言:javascript
复制
 DT[, x:=replace(x, which(v %in% (v+3)), 2222), by=y]
 #   y v    x
 #1: 1 1    9
 #2: 1 2    9
 #3: 1 4 2222
 #4: 3 4   10
 #5: 3 5   11
 #6: 3 8 2222

或者,您可以创建一个逻辑索引列,然后在下一步执行赋值。

代码语言:javascript
复制
 DT[,indx:=v %in% (v+3), by=y][(indx), x:=2222, by=y][, indx:=NULL]
 DT
 #   y v    x
 #1: 1 1    9
 #2: 1 2    9
 #3: 1 4 2222
 #4: 3 4   10
 #5: 3 5   11
 #6: 3 8 2222

或者使用.I稍微修改自己的方法,以便创建一个索引

代码语言:javascript
复制
indx <- DT[, .I[which((v-3) %in% v)], by = y]$V1
DT[indx, x := 2222]
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29823268

复制
相关文章

相似问题

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