Скопировать значение в кадре данных вверх / вниз x ячеек - PullRequest
0 голосов
/ 05 апреля 2020

Как я могу скопировать значения в кадре данных вверх и вниз 5 раз?

Ниже приведен мой минимальный пример:

    structure(list(Date = structure(c(16448, 16449, 16450, 16451, 
16455, 16456, 16457, 16458, 16461, 16462, 16463, 16464, 16465, 
16468, 16469, 16470, 16471, 16472, 16475, 16476, 16477, 16478, 
16479, 16483, 16484, 16485, 16486, 16489, 16490, 16491, 16492
), class = "Date"), Share.price = c(18.56, 18.93, 18.55, 20.25, 
20.22, 20.1, 20.59, 20.65, 20.84, 20.47, 20.67, 20.75, 20.89, 
21.12, 21.66, 21.52, 21.82, 22.11, 22.04, 22.28, 22.66, 22.94, 
23.11, 23.49, 23.41, 23.32, 23.31, 23.37, 23.54, 23.45, 23.35
), NASDAQ100 = c(4166.2, 4145.84, 4089.65, 4142.14, 4171.21, 
4192.09, 4270.36, 4278.14, 4275.72, 4165.5, 4140.38, 4181.35, 
4148.43, 4188.59, 4229.15, 4221.2, 4256.18, 4228.68, 4216.09, 
4281.16, 4297.28, 4347.97, 4384.03, 4385.34, 4390.91, 4411.86, 
4443.05, 4449.49, 4451.03, 4440.59, 4462.27), stock_return = c(-0.0159066808059385, 
0.0199353448275863, -0.0200739566825145, 0.091644204851752, -0.00148148148148154, 
-0.00593471810089008, 0.0243781094527362, 0.00291403593977653, 
0.00920096852300248, -0.0177543186180423, 0.00977039570102603, 
0.00387034349298492, 0.00674698795180726, 0.0110100526567736, 
0.0255681818181818, -0.00646352723915053, 0.0139405204460967, 
0.0132905591200733, -0.00316598824061512, 0.0108892921960074, 
0.0170556552962298, 0.0123565754633716, 0.00741063644289443, 
0.0164430982258762, -0.00340570455512977, -0.00384451089278086, 
-0.000428816466552383, 0.00257400257400267, 0.0072742832691484, 
-0.0038232795242141, -0.00426439232409373), market_return = c(-0.000904083242805209, 
-0.00488694733810179, -0.0135533450398472, 0.012834839167166, 
0.0070181114110097, 0.00500574173920759, 0.0186708777721851, 
0.00182186045204635, -0.000565666387729264, -0.0257781145631613, 
-0.00603048853679028, 0.00989522700814907, -0.00787305535293627, 
0.00968077079762702, 0.00968344956178559, -0.00187981036378464, 
0.00828674310622583, -0.00646119290067619, -0.00297728842097301, 
0.015433731253365, 0.00376533462893232, 0.0117958336436072, 0.00829352548430635, 
0.00029881182382429, 0.00127014096968529, 0.00477122054426072, 
0.00706958063039183, 0.00144945476643288, 0.000346107081935225, 
-0.00234552451904382, 0.0048822341175385), Dividend_change = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Increase", 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), alpha = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.000404446336263359, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), beta = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.976061079957424, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, 
-31L), class = "data.frame")

Моя цель - скопировать данные "divident_change" , "альфа", "бета вверх / вниз 5 строк.

Заранее спасибо за ответ на мой вопрос!

1 Ответ

0 голосов
/ 05 апреля 2020

Если мы хотим назначить на основе непустых элементов, создайте непустой индекс

i1 <- which(nzchar(value))
n <- 5
for(i in i1)  value[c(i-seq_len(n), i + seq_len(n))] <- value[i]
value
#[1] ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  "5" "5" "5" "5" "5" "5" "5" "5" "5" "5"
#[26] "5" ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" ""  ""  "" 
#[51] ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  "" 

Для обновленного набора данных

nm1 <- c("Dividend_change", "alpha", "beta")
n <- 5
for(nm in nm1) {
   i1 <- which(!is.na(dfn[[nm]]))
   for(i in i1) dfn[[nm]][c(i-seq_len(n), i + seq_len(n))] <- dfn[[nm]][i]
   }

 dfn
...