通过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
>