R 循环以计算权重并创建新变量
如果我从以下数据集开始并调用R 循环以计算权重并创建新变量,r,loops,dplyr,iteration,R,Loops,Dplyr,Iteration,如果我从以下数据集开始并调用df: A B 0.8 0.9 0.99 0.88 0.7 0.9658 0.65 0.6684 我的目标是实现以下数据集,其中包含一组新变量,使用与初始集不同的权重: A B A_10 A_20 A_30 A_40 A_50 0.8 0.9 0.89 0.88 0.87 0.86 0.85 0.99 0.88
df
:
A B
0.8 0.9
0.99 0.88
0.7 0.9658
0.65 0.6684
我的目标是实现以下数据集,其中包含一组新变量,使用与初始集不同的权重:
A B A_10 A_20 A_30 A_40 A_50
0.8 0.9 0.89 0.88 0.87 0.86 0.85
0.99 0.88 0.891 0.902 0.913 0.924 0.935
0.7 0.9658 0.93922 0.91264 0.88606 0.85948 0.8329
0.65 0.6684 0.66656 0.66472 0.66288 0.66104 0.6592
我使用的代码是:
for (i in 10:90) {
df <- df %>% mutate(A_[i] =(A*[i]/100)+(B*((1-[i])/100))) }
for(10:90中的i){
df%突变(A[i]=(A*[i]/100)+(B*((1-[i])/100)))
我得到了以下错误:
错误:在“df%变异(A_i]=”中出现意外的“=”*
主要的一点是,要动态命名
dplyr
,您应该使用语法%%>%mutate(!!paste0(“BG_”),i:=A+B)
for(i在seq(10,90,10))中){
df%
突变(!!paste0(“BG_u1;”,i):=(A*i/100)+(B*((1-i)/100)))
}
df
#A B BG_10 BG_20 BG_30 BG_40 BG_50 BG_60
# 1 0.80 0.9000 -0.001000 -0.011000 -0.021000 -0.031000 -0.041000 -0.051000
# 2 0.99 0.8800 0.019800 0.030800 0.041800 0.052800 0.063800 0.074800
# 3 0.70 0.9658 -0.016922 -0.043502 -0.070082 -0.096662 -0.123242 -0.149822
# 4 0.65 0.6684 0.004844 0.003004 0.001164 -0.000676 -0.002516 -0.004356
#BG_70 BG_80 BG_90
# 1 -0.061000 -0.071000 -0.081000
# 2 0.085800 0.096800 0.107800
# 3 -0.176402 -0.202982 -0.229562
# 4 -0.006196 -0.008036 -0.009876
使用的数据:
df <- read.table(text = "A B
0.8 0.9
0.99 0.88
0.7 0.9658
0.65 0.6684", head=T)
dfBase R替代方式:
df[paste0('A_', seq(10, 90, 10))] <-
lapply(seq(10, 90, 10), function(i) (df$A * i + df$B * (100 - i)) / 100)
# > df
# A B A_10 A_20 A_30 A_40 A_50 A_60 A_70 A_80 A_90
# 1 0.80 0.9000 0.89000 0.88000 0.87000 0.86000 0.8500 0.84000 0.83000 0.82000 0.81000
# 2 0.99 0.8800 0.89100 0.90200 0.91300 0.92400 0.9350 0.94600 0.95700 0.96800 0.97900
# 3 0.70 0.9658 0.93922 0.91264 0.88606 0.85948 0.8329 0.80632 0.77974 0.75316 0.72658
# 4 0.65 0.6684 0.66656 0.66472 0.66288 0.66104 0.6592 0.65736 0.65552 0.65368 0.65184
df[paste0('A_',seq(10,90,10))]df
#A B A_10 A_20 A_30 A_40 A_50 A_60 A_70 A_80 A_90
# 1 0.80 0.9000 0.89000 0.88000 0.87000 0.86000 0.8500 0.84000 0.83000 0.82000 0.81000
# 2 0.99 0.8800 0.89100 0.90200 0.91300 0.92400 0.9350 0.94600 0.95700 0.96800 0.97900
# 3 0.70 0.9658 0.93922 0.91264 0.88606 0.85948 0.8329 0.80632 0.77974 0.75316 0.72658
# 4 0.65 0.6684 0.66656 0.66472 0.66288 0.66104 0.6592 0.65736 0.65552 0.65368 0.65184
我们也可以将其解析为表达式
library(tidyverse)
library(rlang)
s1 <- seq(10, 90, 10)
# or could be
#s1 <- 10:90
expr1 <- paste(glue::glue("(A * {s1} + B * (100 - {s1}))/100"), collapse=";")
nm1 <- paste0("A_", s1)
out <- df %>%
mutate(!!! parse_exprs(expr1)) %>%
rename_at(vars(-one_of(names(df))), ~ nm1)
out
# A B A_10 A_20 A_30 A_40 A_50 A_60 A_70 A_80 A_90
#1 0.80 0.9000 0.89000 0.88000 0.87000 0.86000 0.8500 0.84000 0.83000 0.82000 0.81000
#2 0.99 0.8800 0.89100 0.90200 0.91300 0.92400 0.9350 0.94600 0.95700 0.96800 0.97900
#3 0.70 0.9658 0.93922 0.91264 0.88606 0.85948 0.8329 0.80632 0.77974 0.75316 0.72658
#4 0.65 0.6684 0.66656 0.66472 0.66288 0.66104 0.6592 0.65736 0.65552 0.65368 0.65184
库(tidyverse)
图书馆(rlang)
s1它应该是seq(10,90,10)。hi和tks再次以这种方式实现了byt,然后它只创建了变量BG_90…请参见下面的代码::::(i in seq(from=10,to=90,by=10)){df2%突变(!!paste0(“BG_”,i):=(BG_total*i)+(onet_total*((100-1)/100))}@Suren,hi(I在seq(10,90,10)中,我只得到了5个变量。具体来说,我只得到了最后一次迭代BG_90。@这一次工作得非常完美!非常感谢所有R社区
library(tidyverse)
library(rlang)
s1 <- seq(10, 90, 10)
# or could be
#s1 <- 10:90
expr1 <- paste(glue::glue("(A * {s1} + B * (100 - {s1}))/100"), collapse=";")
nm1 <- paste0("A_", s1)
out <- df %>%
mutate(!!! parse_exprs(expr1)) %>%
rename_at(vars(-one_of(names(df))), ~ nm1)
out
# A B A_10 A_20 A_30 A_40 A_50 A_60 A_70 A_80 A_90
#1 0.80 0.9000 0.89000 0.88000 0.87000 0.86000 0.8500 0.84000 0.83000 0.82000 0.81000
#2 0.99 0.8800 0.89100 0.90200 0.91300 0.92400 0.9350 0.94600 0.95700 0.96800 0.97900
#3 0.70 0.9658 0.93922 0.91264 0.88606 0.85948 0.8329 0.80632 0.77974 0.75316 0.72658
#4 0.65 0.6684 0.66656 0.66472 0.66288 0.66104 0.6592 0.65736 0.65552 0.65368 0.65184