Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 当使用Mutate减去2个可变列和2个静态对象时,新列是静态的,这是错误的_R_Dplyr - Fatal编程技术网

R 当使用Mutate减去2个可变列和2个静态对象时,新列是静态的,这是错误的

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

所以,我有一个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<-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