T-T
T-T

Reputation: 713

Convert column headers into new columns

My data frame consists of time series financial data from many public companies. I purposely set companies' weights as their column headers while cleaning the data, and I also calculated log returns for each of them in order to calculate weighted returns in the next step.

Here is an example. There are four companies: A, B, C and D, and their corresponding weights in the portfolio are 0.4, 0.3, 0.2, 0.1 separately. So the current data set looks like:

df1 <- data.frame(matrix(vector(),ncol=9, nrow = 4))
colnames(df1) <- c("Date","0.4","0.4.Log","0.3","0.3.Log","0.2","0.2.Log","0.1","0.1.Log")
df1[1,] <- c("2004-10-29","103.238","0","131.149","0","99.913","0","104.254","0")
df1[2,] <- c("2004-11-30","104.821","0.015","138.989","0.058","99.872","0.000","103.997","-0.002")
df1[3,] <- c("2004-12-31","105.141","0.003","137.266","-0.012","99.993","0.001","104.025","0.000")
df1[4,] <- c("2005-01-31","107.682","0.024","137.08","-0.001","99.782","-0.002","105.287","0.012")
df1
        Date     0.4 0.4.Log     0.3 0.3.Log    0.2 0.2.Log     0.1 0.1.Log
1 2004-10-29 103.238       0 131.149       0 99.913       0 104.254       0
2 2004-11-30 104.821   0.015 138.989   0.058 99.872   0.000 103.997  -0.002
3 2004-12-31 105.141   0.003 137.266  -0.012 99.993   0.001 104.025   0.000
4 2005-01-31 107.682   0.024  137.08  -0.001 99.782  -0.002 105.287   0.012

I want to create new columns that contain company weights so that I can calculate weighted returns in my next step:

        Date        0.4 0.4.W   0.4.Log     0.3 0.3.W   0.3.Log    0.2  0.2.W   0.2.Log     0.1 0.1.W   0.1.Log
1 2004-10-29    103.238 0.400   0.000   131.149 0.300   0.000   99.913  0.200   0.000   104.254 0.100   0.000
2 2004-11-30    104.821 0.400   0.015   138.989 0.300   0.058   99.872  0.200   0.000   103.997 0.100   -0.002
3 2004-12-31    105.141 0.400   0.003   137.266 0.300   -0.012  99.993  0.200   0.001   104.025 0.100   0.000
4 2005-01-31    107.682 0.400   0.024   137.080 0.300   -0.001  99.782  0.200   -0.002  105.287 0.100   0.012

Upvotes: 1

Views: 108

Answers (1)

akrun
akrun

Reputation: 886998

We can try

v1 <- grep("^[0-9.]+$", names(df1), value = TRUE)
df1[paste0(v1, ".w")] <- as.list(as.numeric(v1))

Upvotes: 1

Related Questions