Использование al oop для создания новых столбцов в фрейме данных с тем же шаблоном - PullRequest
0 голосов
/ 09 июля 2020

Я хотел бы создать новые столбцы во фрейме данных, в котором я создаю годовые данные. У меня есть следующие переменные:

id_net_profit_20M05
id_op_income_20M05

Вот как выглядит набор данных:

company  ip_net_profit_20M05  ip_op_income_20M05 ip_pl_bef_tax

 x            121                     185              129
 y            145                     87               175

, и я хочу создать годовые переменные с другим отчетным годом:

id_net_profit_Y_20M05 <- id_net_profit_20M05*12/5
id_op_income_Y_20M05 <- id_op_income_20M05*12/5

A l oop выполнит работу для всех переменных, которые у меня есть, но приведенные ниже не работают:

variables<-c("id_net_profit", "id_op_income")
for (v in variables){
  DF$paste0(v,"_20M05_Y",sep="")<- DF$paste0(v,"_20M05",sep="")*12/5
}

Знаете почему?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Замените строку кода в вашем for следующим:

DF[paste0(v,"_20M05_Y",sep="")] <- DF[paste0(v,"_20M05",sep="")]*12/5

Вы не можете получить доступ к столбцу DF, используя просто DF$paste0(...)

Я публикую для вы этот дополнительный пример:

set.seed(1)
df <- data.frame(var1 = rnorm(10), var2 = rnorm(10))
DF$paste0("var", 1) # here you get an error
DF[paste0("var", 1)] # here you don't get an error
0 голосов
/ 09 июля 2020

Предполагая, что ваш data.frame называется df в следующем формате:

str(df)
'data.frame':   2 obs. of  4 variables:
  $ company            : chr  "x" "y"
$ ip_net_profit_20M05: num  121 145
$ ip_op_income_20M05 : num  185 87
$ ip_pl_bef_tax      : num  129 175 

, вы можете попробовать

variables<- names(df)[2:3]
for (i in variables){
    df[,paste0(i,"_20M05_Y",sep="")] <- df[,i]*12/5
}
df
company ip_net_profit_20M05 ip_op_income_20M05 ip_pl_bef_tax ip_net_profit_20M05_20M05_Y ip_op_income_20M05_20M05_Y
1       x                 121                185           129                       290.4                      444.0
2       y                 145                 87           175                       348.0                      208.8

Или использовать альтернативный способ tidyverse

library(tidyverse)
df %>% 
  mutate_at(vars(2,3), list(`20M05_Y` = ~.*12/5), .names="{col}_{fn}")
...