Разделите отрицательные / положительные значения в строке на другую строку в r? - PullRequest
0 голосов
/ 05 июля 2018

Данные, скопированные с помощью dput

(мой первый пример данных, надеюсь, этого достаточно)

У меня есть этот xts-объект weights

> dput(head(weights,4))
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.333333333333333, -0.333333333333333, 
-0.333333333333333, -0.333333333333333, 0, 0, 0, 0, 0, 0.333333333333333, 
0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 
0.333333333333333, 0.333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0.333333333333333, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, -0.333333333333333, -0.333333333333333, -0.333333333333333, 
-0.333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 
0, 0, 0, 0, -0.333333333333333, -0.333333333333333, -0.333333333333333, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.333333333333333), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", class = c("xts", 
"zoo"), index = structure(c(946512000, 949276800, 951782400, 
954460800), tzone = "UTC", tclass = "Date"), .Dim = c(4L, 39L
), .Dimnames = list(NULL, c("ABB.N", "ACTELION.N", "ADECCO.N", 
"ALUSUISSE.N", "BALOISE.N", "CIBA.SC.N", "CLARIANT.N", "CS.GROUP.N", 
"ELEKTROWATT.I", "EMS.CHEMIE", "GEBERIT.N", "GIVAUDAN.N", "JULIUS.BAER.N", 
"KUDELSKI.I", "LAFARGEHOLCIM.N", "LONZA.N", "NESTLE.N", "NOBEL.BIOCARE.N", 
"NOVARTIS.I", "NOVARTIS.N", "RICHEMONT.N", "ROCHE.GS", "SAIRGROUP.N", 
"SBV.N", "SERONO..B..I", "SGS.N", "SULZER.N", "SWATCH.I", "SWATCH.N", 
"SWISS.LIFE.HOLDING.AG.N", "SWISS.RE.N", "SWISSCOM.N", "SYNGENTA.N", 
"SYNTHES.N", "TRANSOCEAN.N", "UBS.GROUP.N", "UBS.I", "UNAXIS.N20", 
"ZURICH.INSURANCE.N")))

и два числовых вектора Pos и Neg

> dput(head(Pos,4))
c(`1999-12-30` = 0.34191022613305, `2000-01-31` = 0.411653443805752, 
`2000-02-29` = 0.393078629707615, `2000-03-31` = 0.376686025847744
)

> dput(head(Neg,4))
c(`1999-12-30` = -1.32059915686837, `2000-01-31` = -1.27821843244263, 
`2000-02-29` = -1.3142472840903, `2000-03-31` = -1.32647296498383)

Что я хочу сделать

Теперь я хочу разделить каждое отрицательное / положительное значение в weights на соответствующую строку в Neg или Pos (если Neg и Pos должны быть преобразованы в матрицу / фрейм данных)

Проблемы

Я пробовал циклы for, apply-functions и простое деление на условия, но я так и не получил желаемый результат, который не может быть настолько сложным для такой простой задачи ...

Из последней проблемы, с которой я столкнулся , похоже, есть также проблемы с поднабором из xts-объектов ...

Эти коды не работают для меня: (в основном ошибки с размерами или индексами ...)

Для цикла:

weights_adj <- apply(weights,1,function(x) if (coredata(x)[coredata(x)>0]){
  coredata(x)[coredata(x)]/Pos
} else if (coredata(x)[coredata(x)<0]){
  coredata(x)[coredata(x)]/Neg
})

применить функцию:

weights_adj <- apply(weights,1,function(x) (coredata(x)[coredata(x)>0])/Pos)

которые + применяются:

which_negative_weight <- t(apply(weights,1,function (x) which(x<0)))

result_negative <- apply(weights,1,function(x) x[,which_negative_weight[1,]])

который + для:

for (i in 1:nrow(weights)){
  (weights[i,which_negative_weight[i,]]/Neg[i,])
}

EDIT:

Решение от @ K.Hua сработало, и он очень быстро мне помог, но решение @ G.Grothendieck проще и быстрее!

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Попробуйте это:

weights / ((weights > 0) * Pos + (weights < 0) * Neg + (weights == 0))
0 голосов
/ 05 июля 2018

Вы пытаетесь разделить выборку вектора размера N на целый вектор размера N. Кроме того, я думаю, что вместо этого проще сделать цикл по столбцам:

weights_adj = weights
neg <- apply(weights,2,function (x) x<0)
for (i in 1:ncol(weights)){
  weights_adj[neg[,i],i] = weights[neg[,i],i]/Neg[neg[,i]]
  weights_adj[!neg[,i],i] = weights[!neg[,i],i]]/Pos[!neg[,i]]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...