при использовании Mutate путем вычитания 2 разных столбцов и 2 статических объектов новые столбцы являются статическими, что неверно - PullRequest
0 голосов
/ 05 октября 2019

Итак, у меня есть фрейм данных, в настоящее время я пытаюсь использовать 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

Текущий код, который у меня есть

T1 <- 20
T2 <- 50
T3 <- 20
T4 <- 10

mydf<-mydf %>%
  group_by(path)%>%
  mutate(T1_ts = Notional - T2 - T3 - T4) %>%
  mutate(T2_ts = Notional - T1_ts - T3 - T4) %>%
  mutate(T3_ts = Notional - T1_ts - T2_ts - T4) %>%
  mutate(T4_ts = Notional - T1_ts - T2_ts - T3_ts)
mydf[mydf < 0] <- 0
print(mydf)

Желаемый вывод:

mydf2<- 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,20,10,0,0,0,20,0,0,0,0,50,50,10,0,0,50,50,20,0,0,20,20,20,20,0,20,20,20,0,0,10,10,10,10,0,10,10,10,10,0), nrow=10, ncol=7))
colnames <- c("path","month", "Notional","T1","T2","T3","T4")
mydf2<-setNames(mydf2,colnames)
print(mydf2)

> print(mydf2)
   path month Notional T1 T2 T3 T4
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

К сожалению, что я на самом делеполучить из кода это:

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

Что я сделал не так?

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Проблема состоит в том, что переменные меньше 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
1 голос
/ 05 октября 2019

Не уверен, чего вы хотите достичь, но я вижу некоторые проблемы с вашим кодом.

T1_ts = Notional - T2 - T3 - T4, затем

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

Код генерирует только постоянные значения для T2_ts = T2 , T3_ts = T3 и T4_ts = T4 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...