![](/img/trans.png)
[英]Use loop for create multiple columns from another columns in dataframe in R
[英]Create multiple columns in dataframe from a function or vector in R
我想在数据框中创建多个列,每列都根据现有列中的值计算不同的值。
假设我有以下数据框:
date <- c('1','2','3','4','5')
close <- c('10','20','15','13','19')
test_df <- data.frame(date,close)
我想创建一个使用 dplyr 执行以下操作的新列:
test_df %>%
mutate(logret = log(close / lag(close, n=1)))
但是,我想为 n 的多个值创建一个新列,以便我有列:
logret1 for n=1,
logret2 for n=2,
logret3 for n=3
等等...
我使用函数seq(from=1, to=5, by=1)
作为示例来获取一个数字向量来替换 n 。 我试图围绕 mutate 函数创建一个 for 循环:
seq2 <- seq(from=1, to=5, by=1)
for (number in seq2){
new_df <- test_df %>%
mutate(logret = log(close/lag(close, n=seq2)))
}
但是我收到错误:
Error: Problem with `mutate()` input `logret`. x `n` must be a nonnegative integer scalar, not a double vector of length 5. i Input `logret` is `log(close2/lag(close2, n = seq2))`.
我意识到我不能为 n 传递一个向量,但是我被困在如何继续。
任何帮助将不胜感激,谢谢。
您可以使用purrr
的map_dfc
添加新列:
library(dplyr)
library(purrr)
n <- 3
bind_cols(test_df, map_dfc(1:n, ~test_df %>%
transmute(!!paste0('logret', .x) := log(close / lag(close, n=.x)))))
# date close logret1 logret2 logret3
#1 1 10 NA NA NA
#2 2 20 0.6931472 NA NA
#3 3 15 -0.2876821 0.4054651 NA
#4 4 13 -0.1431008 -0.4307829 0.26236426
#5 5 19 0.3794896 0.2363888 -0.05129329
数据
test_df <- data.frame(date,close)
test_df <- type.convert(test_df)
您可以使用data.table
。 它是一个 R 包,提供了data.frame
的增强版本。 这是开始使用https://www.machinelearningplus.com/data-manipulation/datatable-in-r-complete-guide/的绝佳资源
library(data.table)
#Create data.table
test_dt <- data.table(date, close)
#Define the new cols names
logret_cols <- paste0('logret', 1:3)
#Create new columns
test_dt[, (logret_cols) := lapply(1:3, function(n) log(close / lag(close, n = n)))]
test_dt
# date close logret1 logret2 logret3
#1: 1 10 NA NA NA
#2: 2 20 0.6931472 NA NA
#3: 3 15 -0.2876821 0.4054651 NA
#4: 4 13 -0.1431008 -0.4307829 0.26236426
#5: 5 19 0.3794896 0.2363888 -0.05129329
data.table
有一种有趣的方式来有效地处理内存。 如果你会处理大量数据,看看这个基准测试,很棒: https : //h2oai.github.io/db-benchmark/
编辑
您甚至可以混合使用data.table
和purrr
。 这是使用函数purrr::map()
的示例
test_dt[, (logret_cols) := map(1:3, ~log(close / lag(close, n = .x)))]
test_dt
# date close logret1 logret2 logret3
#1: 1 10 NA NA NA
#2: 2 20 0.6931472 NA NA
#3: 3 15 -0.2876821 0.4054651 NA
#4: 4 13 -0.1431008 -0.4307829 0.26236426
#5: 5 19 0.3794896 0.2363888 -0.05129329
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.