通过R的特定行中的另一项规范化数据列

通过R的特定行中的另一项规范化数据列,r,R,所以我有一个数据集(这是一个玩具示例) 有人知道解决这个问题的简单方法吗?(我的大脑现在像糊状物一样)by(dat,dat[1],FUN=function(dfm){ dfm[dfm$dates2!=-1,3]by(dat,dat[1],FUN=function(dfm){ dfm[dfm$dates2!=-1,3]更新: 很好,一行,对@Arun的赞美(在下面的评论中): 原始答复: 更新: 很好,一行,对@Arun的赞美(在下面的评论中): 原始答复: 我不明白你是如何从输入到输出的:我

所以我有一个数据集(这是一个玩具示例)

有人知道解决这个问题的简单方法吗?(我的大脑现在像糊状物一样)

by(dat,dat[1],FUN=function(dfm){
dfm[dfm$dates2!=-1,3]
by(dat,dat[1],FUN=function(dfm){
dfm[dfm$dates2!=-1,3]更新:
很好,一行,对@Arun的赞美(在下面的评论中):


原始答复: 更新: 很好,一行,对@Arun的赞美(在下面的评论中):


原始答复:
我不明白你是如何从输入到输出的:
我需要把amt除以它本身,但只有在dates2=1的地方。
不会把amt除以它本身得到
1
?那么
c(1,2,1,2,2,3)在哪里呢
列来自?啊,是的,我知道它不清楚的地方。所有行,不包括dates2=-1的行。在输出集中,amt将被dates2=-1的amt除以,其中dates2=-1,日期与行匹配(就像自联接一样)因此,第2行date=1和date2=1,100将被第date=1和date2=-1行除以1000。这有意义吗?
clean
对象似乎是一个数据帧,但
dat
对象是一个矩阵。这是有意的吗?不,clean是一个数据帧。只是键入了它。我不明白你是如何从中得到的输出:
我需要除以amt,但仅在dates2为-1的情况下。
amt
除以amt不会得到
1
?而
c(1,2,1,2,2,3)在哪里
列来自?啊,是的,我知道它不清楚的地方。所有行,不包括dates2=-1的行。在输出集中,amt将被dates2=-1的amt除以,其中dates2=-1,日期与行匹配(就像自联接一样)因此,第2行date=1和date2=1,100将被第date=1和date2=-1行除以1000。这有意义吗?
clean
对象似乎是一个数据帧,但
dat
对象是一个矩阵。这是有意的吗?不,clean是指一个数据帧。只需输入(+1)很好的解决方案。或者,也可以不用拆分数据。我想这样的表:
DT[,amt:={amt@Arun,谢谢你的建议!事实上,我认为我们可以做得更干净。编辑回答这对数据非常有效。表1.8.1。但是,我的盒子上只有1.7,所以我不得不这么做(类似于):cbind(DT[dates2!=-1],DT[,amt/amt[dates2=-1],by=dates][dates2!=-1](+1)很好的解决方案。或者,也可以不用拆分数据就可以完成。类似这样的表我想:
DT[,amt:={amt@Arun,谢谢,也谢谢你的建议!事实上,我认为我们可以做得更干净。编辑回答这对数据非常有效。表1.8.1。但是,我的盒子上只有1.7,所以我不得不做(类似于):cbind(DT[dates2!=-1],DT[,amt/amt[dates2=-1],by=dates][dates2!=-1]
dates <- c(1,1,1,2,2,2,3,3,3)
dates2 <- c(-1,1,2,-1,1,2, -1, 2,3) 
amt <- c(1000, 100, 100, 1000, 100, 100, 1000, 100, 100)

dat <- cbind(dates, dates2, amt)
clean
1 1 0.10  (IE 100 / 1000, for row 2)
1 2 0.10
2 1 0.10
2 2 0.10
3 2 0.10
3 3 0.10
 by(dat, dat[1], FUN= function(dfm) {
        dfm[ dfm$dates2 != -1, 3] <-dfm[ dfm$dates2!= -1, 3]/dfm[ dfm$dates2== -1, 3]
        return(dfm[ dfm$dates2 !=-1 ,])  } )
dates: 1
  dates dates2 amt
2     1      1 0.1
3     1      2 0.1
----------------------------------------------------------------------------- 
dates: 2
  dates dates2 amt
5     2      1 0.1
6     2      2 0.1
----------------------------------------------------------------------------- 
dates: 3
  dates dates2 amt
8     3      2 0.1
9     3      3 0.1
DT[, amt := { amt <- amt/amt[dates2 == -1] }, by=dates][dates2 != -1]
DT[, amt := amt/amt[dates2 == -1], by=dates][dates2 != -1]
library(data.table)

DT <- data.table(dat, key="dates")

# grab "-1" rows, at same time, change col name for simplicity
DT.dates2 <- setnames(DT[dates2==(-1)], "amt", "amt.d")

# remove rows where dates2 == -1
DT <- DT[dates2 != -1] 

# divide as required
DT[DT[dates==dates2][DT.dates2], amt := amt / amt.d]
DT 

   dates dates2 amt
1:     1      1 0.1
2:     1      2 0.1
3:     2      1 0.1
4:     2      2 0.1
5:     3      2 0.1
6:     3      3 0.1
>