根据数学计算创建新列

时间:2016-10-03 11:14:26

标签: r

我有一个如下所示的数据框:

df

X24_TT_1.1  X135_121.FTT_2.1    X1055_121.FTT_3.1
   0.14          0.84                 0.92
   0.88          0.06                 0.08
   0.91          0.17                 0.85
   0.08          0.9                  0.11
   0.11          0.16                 0.04
   0.83          0.1                  0.87

我想创建新的列,这些列具有相同的名称和附加的" _P"最后添加,计算公式为:

列X24_TT_1.1 = 24 *(0.14 /(1-0.14))

列X135_121.FTT_2.1 = 135 *(0.84 /(1-0.84))

列X1055_121.FTT_3.1 = 1055 *(0.92 /(1-0.92))

最后看起来应该是这样的:

X24_TT_1.1  X135_121.FTT_2.1    X1055_121.FTT_3.1   X24_TT_1.2_P    X135_121.FTT_2.2_P  X1055_121.FTT_3.2_P
0.14              0.84               0.92              3.91            708.75             12132.50
0.88              0.06               0.08            176.00              8.62             91.74
0.91              0.17               0.85            242.67             27.65             5978.33
0.08              0.9                0.11              2.09           1215.00             130.39
0.11              0.16               0.04              2.97             25.71              43.96
0.83              0.1                0.87            117.18             15.00            7060.38

我想动态地执行此操作,因为数据集有超过100列

2 个答案:

答案 0 :(得分:0)

您可以使用$ sign向数据框添加新列,执行以下操作:

df$X24_TT_1.1_P <- 24 * (df$X24_TT_1.1/(1-df$X24_TT_1.1))

修改

假设你有一些数字会在一个单独的列表中将每一列相乘,你可以这样做:

multiplier <- c(24,135,1055)
A = c(2, 3, 5) 
B = c(4, 5, 6) 
C = c(7, 8, 9) 
df = data.frame(A, B, C) 

new_names <- paste(colnames(df), "_P")
names <- c(colnames(df),new_names)
initial_ncol <- ncol(df)
for (i in 1:initial_ncol){

df$name <- multiplier[i] * (df$A/(1-df$A))
colnames(df) <- names[1:(i+initial_ncol)]
}

答案 1 :(得分:0)

试试这个:

x <- sapply(names(df), function(x) {
            s <- strsplit(x, "_")[[1]][1]
            s <- substring(s, 2, nchar(s))
            as.numeric(s)*(df[,x]/(1 - df[,x]))
     })


colnames(x) <- paste0(colnames(df), "_P")
cbind(df, round(x,2))

  X24_TT_1.1 X135_121.FTT_2.1 X1055_121.FTT_3.1 X24_TT_1.1_P X135_121.FTT_2.1_P X1055_121.FTT_3.1_P
1       0.14             0.84              0.92         3.91             708.75            12132.50
2       0.88             0.06              0.08       176.00               8.62               91.74
3       0.91             0.17              0.85       242.67              27.65             5978.33
4       0.08             0.90              0.11         2.09            1215.00              130.39
5       0.11             0.16              0.04         2.97              25.71               43.96
6       0.83             0.10              0.87       117.18              15.00             7060.38