我有一个如下所示的数据框:
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列
答案 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