Как запустить длинный блок кода для каждого столбца во фрейме данных? - PullRequest
0 голосов
/ 08 июля 2019

Итак, у меня есть код, который я написал для выполнения некоторых преобразований в столбце фрейма данных со 108 столбцами.Преобразования для столбца хранятся в 3 разных фреймах данных, соответствующих различным типам преобразования.

Я знаю, что, вероятно, я не делаю это эффективно вообще, но этот код работает для того, что мне нужно для одного столбца.Однако теперь мне нужно запустить код для каждого столбца исходного фрейма данных, создав 324 фрейма данных.На данный момент я не исключаю, что просто скопируйте, вставьте, затем найдите и замените имена столбцов 108 раз (как бы утомительно это ни было).Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как использовать цикл for со всеми операциями и функциями, задействованными в моем коде (создание фреймов данных, создание столбцов внутри этих фреймов данных, преобразование этих столбцов и т. Д.).

Каждый столбец моего исходного фрейма данных называется буквой алфавита от A до DD.Опять же, я хочу, чтобы R-эквивалент находил и заменял 108 раз, вплоть до имен фреймов данных и всего остального.

Это всего лишь часть кода, если он имеет отношение:

feat <- read.csv2(file="S:/Wladimir Sarmiento/MLData.csv", header=T, stringsAsFactors=FALSE)
names(feat)[1]<- "A"
feat$A <- as.Date(feat$A)
feat[] <- lapply(feat, function(x) {
    if(is.character(x)) as.numeric(x) else x
 })



K.change.w <- data.frame(feat$A, feat$K)
K.change.m <-  data.frame(feat$A, feat$K)
K.change.3m <-  data.frame(feat$A, feat$K)



K.change.w <- mutate(K.change.w, K = K.change.w$feat.K - lag(K.change.w$feat.K, 5) )
K.change.m <- mutate(K.change.m, K = K.change.w$feat.K - lag(K.change.w$feat.K, 20) )
K.change.3m <- mutate(K.change.3m, K = K.change.w$feat.K - lag(K.change.w$feat.K, 62) )
```


roll.mean.m.K <- rollmean(K.change.w$K, 21, align="right", fill=NA)
K.change.w <- mutate(K.change.w, roll.mean.m.K)

zw <- read.zoo(K.change.w)
sd.m.K = rollapply(zw$K,21,sd,align="right", fill=NA) 
sd.m.K <- as.data.frame(sd.m.K)
K.change.w <- mutate(K.change.w, sd.m.K$sd.m.K)
names(K.change.w)[5]<- "sd.m.K"

K.change.w$z.m.K <- (K.change.w$K - K.change.w$roll.mean.m.K)/(K.change.w$sd.m.K)
ggplot(data=K.change.w, aes(x=feat.A, y=z.m.K, group=1)) + geom_point() + geom_line() + scale_x_date(labels = date_format("%Y")) + labs(title="K, W, M", x="Year", y=NULL) + geom_hline(yintercept=0, color="red")

roll.mean.m.K <- rollmean(K.change.m$K, 21, align="right", fill=NA)
K.change.m <- mutate(K.change.m, roll.mean.m.K)

zw <- read.zoo(K.change.m)
sd.m.K = rollapply(zw$K,21,sd,align="right", fill=NA) 
sd.m.K <- as.data.frame(sd.m.K)
K.change.m <- mutate(K.change.m, sd.m.K$sd.m.K)
names(K.change.m)[5]<- "sd.m.K"

K.change.m$z.m.K <- (K.change.m$K - K.change.m$roll.mean.m.K)/(K.change.m$sd.m.K)
ggplot(data=K.change.m, aes(x=feat.A, y=z.m.K, group=1)) + geom_point() + geom_line() + scale_x_date(labels = date_format("%Y")) + labs(title="K, M, M", x="Year", y=NULL) + geom_hline(yintercept=0, color="red")

roll.mean.m.K <- rollmean(K.change.3m$K, 21, align="right", fill=NA)
K.change.3m <- mutate(K.change.3m, roll.mean.m.K)

zw <- read.zoo(K.change.3m)
sd.m.K = rollapply(zw$K,21,sd,align="right", fill=NA) 
sd.m.K <- as.data.frame(sd.m.K)
K.change.3m <- mutate(K.change.3m, sd.m.K$sd.m.K)
names(K.change.3m)[5]<- "sd.m.K"

K.change.3m$z.m.K <- (K.change.3m$K - K.change.3m$roll.mean.m.K)/(K.change.3m$sd.m.K)
ggplot(data=K.change.3m, aes(x=feat.A, y=z.m.K, group=1)) + geom_point() + geom_line() + scale_x_date(labels = date_format("%Y")) + labs(title="K, 3M, M", x="Year", y=NULL) + geom_hline(yintercept=0, color="red")

Было бы здорово, если бы R буквально просто считывал индексную переменную в цикле for и заменял ее в коде значением, необходимым для этого.То есть замените все K в приведенном выше коде на i, а затем просто запустите цикл for, заменяя K на каждой итерации новой буквой.

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