我想创建一个循环,将现在的变量添加到数据框.这些变量应该是现有变量的简单二次形式.在下面的例子中我想有3个新的var是:dat$birds_2 <- dat$birds^2; dat$wolfs_2 <- dat$wolfs^2; dat$snakes_2 <- dat$snakes^2.我想一次为多个变量做这个.
dat <- read.table(text = " birds wolfs snakes
3 9 7
3 8 4
1 2 8
1 2 3
1 8 3
6 1 2
6 7 1
6 1 5
5 9 7
3 8 7
4 2 7
1 2 3
7 6 3
6 1 1
6 3 9
6 1 1 ",header = TRUE)
Run Code Online (Sandbox Code Playgroud)
所需的输出(dat_new)是(我只显示前两行):
dat_new birds wolfs snakes birds_2 wolfs_2 snakes_2
3 9 7 9 81 49
3 8 4 9 64 16
Run Code Online (Sandbox Code Playgroud)
Col*_*vel 10
在一个衬垫中setNames:
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
Run Code Online (Sandbox Code Playgroud)
akr*_*run 10
一个选项使用 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
Run Code Online (Sandbox Code Playgroud)
或者您可以使用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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
您可以执行以下操作(不使用循环):
dat_2 <- dat^2
colnames(dat_2) <- paste0(colnames(dat),"_2")
dat_tot <- cbind(dat, dat_2)
Run Code Online (Sandbox Code Playgroud)
作为替代方案,您也可以使用dplyr包很容易地做到这一点:
library(dplyr)
dat_new <- dat %>% mutate_all(funs(.^2))
names(dat_new) <- paste0(names(dat_new),"_2")
dat_new <- cbind(dat,dat_new)
Run Code Online (Sandbox Code Playgroud)
这给了:
> 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
Run Code Online (Sandbox Code Playgroud)