R 当使用Mutate减去2个可变列和2个静态对象时,新列是静态的,这是错误的
所以,我有一个dataframe,我正在尝试使用mutate从当前列中生成新列,已经创建了新列,还有一些静态对象 数据样本:R 当使用Mutate减去2个可变列和2个静态对象时,新列是静态的,这是错误的,r,dplyr,R,Dplyr,所以,我有一个dataframe,我正在尝试使用mutate从当前列中生成新列,已经创建了新列,还有一些静态对象 数据样本: ##All mydf<- as.data.frame(matrix(c(1,1,1,1,1,2,2,2,2,2,0,1,2,3,4,0,1,2,3,4,100,90,40,30,0,100,80,50,10,0), nrow=10, ncol=3)) colnames <- c("path","month", "Notional") mydf<-setN
##All
mydf<- as.data.frame(matrix(c(1,1,1,1,1,2,2,2,2,2,0,1,2,3,4,0,1,2,3,4,100,90,40,30,0,100,80,50,10,0), nrow=10, ncol=3))
colnames <- c("path","month", "Notional")
mydf<-setNames(mydf,colnames)
print(mydf)
> print(mydf)
path month Notional
1 1 0 100
2 1 1 90
3 1 2 40
4 1 3 30
5 1 4 0
6 2 0 100
7 2 1 80
8 2 2 50
9 2 3 10
10 2 4 0
##全部
mydf不确定您想要实现什么,但我可以看到您的代码中存在一些问题
T1\u ts=名义上的-T2-T3-T4
,
那么
代码仅为T2\u ts=T2、T3\u ts=T3和T4\u ts=T4生成常量值 不确定您想要实现什么,但我可以看到您的代码存在一些问题
T1\u ts=名义上的-T2-T3-T4
,
那么
代码仅为T2\u ts=T2、T3\u ts=T3和T4\u ts=T4生成常量值 问题是小于0的变量应立即替换为0,否则这些负值将被纳入计算中,并给出错误的值。我们可以使用pmax
来实现这一点
library(dplyr)
mydf %>%
group_by(path)%>%
mutate(T1_ts = pmax(Notional - T2 - T3 - T4, 0),
T2_ts = pmax(Notional - T1_ts - T3 - T4, 0),
T3_ts = pmax(Notional - T1_ts - T2_ts - T4, 0),
T4_ts = Notional - T1_ts - T2_ts - T3_ts)
# path month Notional T1_ts T2_ts T3_ts T4_ts
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 0 100 20 50 20 10
# 2 1 1 90 10 50 20 10
# 3 1 2 40 0 10 20 10
# 4 1 3 30 0 0 20 10
# 5 1 4 0 0 0 0 0
# 6 2 0 100 20 50 20 10
# 7 2 1 80 0 50 20 10
# 8 2 2 50 0 20 20 10
# 9 2 3 10 0 0 0 10
#10 2 4 0 0 0 0 0
库(dplyr)
mydf%>%
分组依据(路径)%>%
突变(T1_ts=pmax(名义值-T2-T3-T4,0),
T2_ts=pmax(名义-T1_ts-T3-T4,0),
T3_ts=pmax(名义值-T1_ts-T2_ts-T4,0),
T4\u ts=概念-T1\u ts-T2\u ts-T3\t)
#路径月名义T1\u ts T2\u ts T3\u ts T4\u ts
#
# 1 1 0 100 20 50 20 10
# 2 1 1 90 10 50 20 10
# 3 1 2 40 0 10 20 10
# 4 1 3 30 0 0 20 10
# 5 1 4 0 0 0 0 0
# 6 2 0 100 20 50 20 10
# 7 2 1 80 0 50 20 10
# 8 2 2 50 0 20 20 10
# 9 2 3 10 0 0 0 10
#10 2 4 0 0 0 0 0
问题是小于0的变量应立即替换为0,否则这些负值将被纳入计算中,并给出错误的值。我们可以使用pmax
来实现这一点
library(dplyr)
mydf %>%
group_by(path)%>%
mutate(T1_ts = pmax(Notional - T2 - T3 - T4, 0),
T2_ts = pmax(Notional - T1_ts - T3 - T4, 0),
T3_ts = pmax(Notional - T1_ts - T2_ts - T4, 0),
T4_ts = Notional - T1_ts - T2_ts - T3_ts)
# path month Notional T1_ts T2_ts T3_ts T4_ts
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 0 100 20 50 20 10
# 2 1 1 90 10 50 20 10
# 3 1 2 40 0 10 20 10
# 4 1 3 30 0 0 20 10
# 5 1 4 0 0 0 0 0
# 6 2 0 100 20 50 20 10
# 7 2 1 80 0 50 20 10
# 8 2 2 50 0 20 20 10
# 9 2 3 10 0 0 0 10
#10 2 4 0 0 0 0 0
库(dplyr)
mydf%>%
分组依据(路径)%>%
突变(T1_ts=pmax(名义值-T2-T3-T4,0),
T2_ts=pmax(名义-T1_ts-T3-T4,0),
T3_ts=pmax(名义值-T1_ts-T2_ts-T4,0),
T4\u ts=概念-T1\u ts-T2\u ts-T3\t)
#路径月名义T1\u ts T2\u ts T3\u ts T4\u ts
#
# 1 1 0 100 20 50 20 10
# 2 1 1 90 10 50 20 10
# 3 1 2 40 0 10 20 10
# 4 1 3 30 0 0 20 10
# 5 1 4 0 0 0 0 0
# 6 2 0 100 20 50 20 10
# 7 2 1 80 0 50 20 10
# 8 2 2 50 0 20 20 10
# 9 2 3 10 0 0 0 10
#10 2 4 0 0 0 0 0
该代码的目的是能够按顺序逐步淘汰T1、T2、T3,因此,例如,当T1耗尽时,它将被排除在计算之外,自然T2将因此发生变化。这个逻辑其实并不错误。我已经接受了另一个答案,它解决了我的代码问题,但感谢您的输入!该代码的目的是能够按顺序逐步淘汰T1、T2、T3,因此,例如,当T1耗尽时,它将被排除在计算之外,自然T2将因此而改变。这个逻辑其实并不错误。我已经接受了另一个答案,它解决了我的代码问题,但感谢您的输入!是的,很有效,谢谢!另一方面,我将在未来处理大量数据,您是否介意向我推荐一些有用的软件包,例如dplyr?@ProgramMadLad使用软件包主要取决于您的用例。如果您处理大量数据,您可以使用data.table
,因为它被认为是非常有效的。是的,它很有效,谢谢!另一方面,我将在未来处理大量数据,您是否介意向我推荐一些有用的软件包,例如dplyr?@ProgramMadLad使用软件包主要取决于您的用例。如果你处理大量数据,你可以使用data.table
,因为它被认为是非常有效的。
> print(mydf)
# A tibble: 10 x 7
# Groups: path [2]
path month Notional T1_ts T2_ts T3_ts T4_ts
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0 100 20 50 20 10
2 1 1 90 10 50 20 10
3 1 2 40 0 50 20 10
4 1 3 30 0 50 20 10
5 1 4 0 0 50 20 10
6 2 0 100 20 50 20 10
7 2 1 80 0 50 20 10
8 2 2 50 0 50 20 10
9 2 3 10 0 50 20 10
10 2 4 0 0 50 20 10
>
T2_ts = Notional - T1_ts - T3 - T4
= Notional - (Notional - T2 - T3 - T4) - T3 - T4
= T2
T3_ts = Notional - T1_ts - T2_ts - T4
= Notional - (Notional - T2 - T3 - T4) - (T2) - T4
= T3
T4_ts = Notional - T1_ts - T2_ts - T3_ts
= Notional - (Notional - T2 - T3 - T4) - (T2) - (T3)
= T4
library(dplyr)
mydf %>%
group_by(path)%>%
mutate(T1_ts = pmax(Notional - T2 - T3 - T4, 0),
T2_ts = pmax(Notional - T1_ts - T3 - T4, 0),
T3_ts = pmax(Notional - T1_ts - T2_ts - T4, 0),
T4_ts = Notional - T1_ts - T2_ts - T3_ts)
# path month Notional T1_ts T2_ts T3_ts T4_ts
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 0 100 20 50 20 10
# 2 1 1 90 10 50 20 10
# 3 1 2 40 0 10 20 10
# 4 1 3 30 0 0 20 10
# 5 1 4 0 0 0 0 0
# 6 2 0 100 20 50 20 10
# 7 2 1 80 0 50 20 10
# 8 2 2 50 0 20 20 10
# 9 2 3 10 0 0 0 10
#10 2 4 0 0 0 0 0