R 如何向数据框添加新的计算变量

R 如何向数据框添加新的计算变量,r,loops,dataframe,R,Loops,Dataframe,我想创建一个循环,现在将变量添加到数据框架中。这些变量应该是现有变量的简单二次型。 在下面的示例中,我希望有3个新变量:dat$birds\u 2您可以执行以下操作(不使用循环): dat_2如果您想获得某些变量的二次值(例如dat的变量1到10),您可以执行以下操作: ncol_ori <- ncol(dat) dat <- cbind(dat, apply(dat[, 1:10], 2, "^", 2)) # or actually just cbind(dat, dat[, 1

我想创建一个循环,现在将变量添加到数据框架中。这些变量应该是现有变量的简单二次型。 在下面的示例中,我希望有3个新变量:
dat$birds\u 2您可以执行以下操作(不使用循环):


dat_2如果您想获得某些变量的二次值(例如
dat
的变量1到10),您可以执行以下操作:

ncol_ori <- ncol(dat)
dat <- cbind(dat, apply(dat[, 1:10], 2, "^", 2)) # or actually just cbind(dat, dat[, 1:10]^2)
colnames(dat)[(ncol_ori+1):ncol(dat)] <- paste(colnames(dat)[1:10], 2, sep="_")

另一种选择是,您也可以使用
dplyr
软件包轻松完成此操作:

library(dplyr)

dat_new <- dat %>% mutate_all(funs(.^2))
names(dat_new) <- paste0(names(dat_new),"_2")
dat_new <- cbind(dat,dat_new)

在带有
集合名的一行程序中

setNames(as.data.frame(cbind(dat, dat^2)), c(names(dat), paste0(names(dat),'_2')))

#   birds wolfs snakes birds_2 wolfs_2 snakes_2
#1      3     9      7       9      81       49
#2      3     8      4       9      64       16

使用
data.table的选项

library(data.table)
setDT(dat)[, paste0(names(dat),"_2") := lapply(.SD, '^', 2)]
head(dat,2)
#   birds wolfs snakes birds_2 wolfs_2 snakes_2
#1:     3     9      7       9      81       49
#2:     3     8      4       9      64       16
或者您可以使用
set
(这会更有效),因为有多个列

setDT(dat)
dat_new <- copy(dat)
for(j in 1:ncol(dat_new)){
   set(dat_new, i=NULL, j=j, value=dat_new[[j]]^2)
 }
 cbind(dat, dat_new)
setDT(dat)

你有没有试过你的密码?。。。(因为它很可能会给你想要的;-)当然除了循环部分)我尝试了apply函数,但只得到了当前变量的值。我对循环是新手,所以我不知道该如何开始。只需传递你的代码:
dat$birds\u 2没有经验的程序员会用循环来做这件事。它的速度较慢,需要更多的代码行。尝试寻找省略循环的内置R函数。如果您想要的不是
dat$birds_2[1]==dat$birds[1]^2
等等,那么您应该在问题中添加所需的输出。对于误解,我很抱歉。。我的意思是,我希望得到一个变量,每个原始值而不是每个列都有二次值。然后尝试
rbind()
而不是
cbind()
。但是,我不确定我是否理解了编辑后的问题。上面的代码与您的输出完全一样示例您是对的,但是如何更改新的变量名称?这很好,但是如何更改新变量名称,例如在名称末尾添加“_2”?@mql4初学者,我添加了2行,这样您就可以在endHello@CathG中使用带有“_2”的新变量命名列,我在dat@mql4初学者中发现了一个错误,可能是因为
dat
中的列少于10列?如果是这样,请将
1:10
替换为需要二次值的列的索引。如果您希望所有列都使用它,您可以使用我回答中的第二段代码是的,我更改了正确的列数,现在它可以工作了..感谢您非常喜欢基准测试!当然,
as.data.frame
转换需要时间。我将其修改为
data.frame
@ColonelBeauvel,我认为
as.data.frame
更快
head(dat)
#   birds wolfs snakes birds_2 wolfs_2 snakes_2
#1      3     9      7       9      81       49
#2      3     8      4       9      64       16
#3      1     2      8       1       4       64
#4      1     2      3       1       4        9
#5      1     8      3       1      64        9
#6      6     1      2      36       1        4
library(dplyr)

dat_new <- dat %>% mutate_all(funs(.^2))
names(dat_new) <- paste0(names(dat_new),"_2")
dat_new <- cbind(dat,dat_new)
> head(dat_new)
  birds wolfs snakes birds_2 wolfs_2 snakes_2
1     3     9      7       9      81       49
2     3     8      4       9      64       16
3     1     2      8       1       4       64
4     1     2      3       1       4        9
5     1     8      3       1      64        9
6     6     1      2      36       1        4
setNames(as.data.frame(cbind(dat, dat^2)), c(names(dat), paste0(names(dat),'_2')))

#   birds wolfs snakes birds_2 wolfs_2 snakes_2
#1      3     9      7       9      81       49
#2      3     8      4       9      64       16
library(data.table)
setDT(dat)[, paste0(names(dat),"_2") := lapply(.SD, '^', 2)]
head(dat,2)
#   birds wolfs snakes birds_2 wolfs_2 snakes_2
#1:     3     9      7       9      81       49
#2:     3     8      4       9      64       16
setDT(dat)
dat_new <- copy(dat)
for(j in 1:ncol(dat_new)){
   set(dat_new, i=NULL, j=j, value=dat_new[[j]]^2)
 }
 cbind(dat, dat_new)
set.seed(24)
dat <- as.data.frame(matrix(sample(0:20, 1e6*200, replace=TRUE), 
       ncol=200))

dat1 <- copy(dat)
dat2 <- copy(dat)


Colonel <- function() { setNames(as.data.frame(cbind(dat, dat^2)),
    c(names(dat), paste0(names(dat),'_2')))}
akrun1 <- function() {setDT(dat1)[, paste0(names(dat1),"_2") := 
            lapply(.SD, '^', 2)]}
akrun2 <- function() {setDT(dat2)
                  dat_new <- copy(dat2)
                  for(j in 1:ncol(dat_new)){
                      set(dat_new, i=NULL, j=j, value=dat_new[[j]]^2)
                   }
                  cbind(dat2, dat_new)}

jaap <- function() {dat_new <- dat %>% 
                     mutate_each(funs(.^2))
                names(dat_new) <- paste0(names(dat_new),"_2")
                dat_new <- cbind(dat,dat_new)}



 cathG <- function() {ncol_ori <- ncol(dat)
                datN <- cbind(dat, apply(dat, 2, "^", 2))
                colnames(datN)[(ncol_ori+1):ncol(datN)] <- 
            paste(colnames(datN)[1:ncol_ori], 2, sep="_")

     }

system.time(Colonel())
#   user  system elapsed 
#  5.589   1.472  46.843 

 system.time(akrun1())
 #   user  system elapsed 
 #  2.125   1.238  10.065 

system.time(akrun2())
#   user  system elapsed 
#  1.522   0.744   3.922 

system.time(jaap())
#   user  system elapsed 
#  1.597   0.926  11.153 

system.time(cathG())
#   user  system elapsed 
#  9.386   3.536  94.360