繁体   English   中英

从 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 传递一个向量,但是我被困在如何继续。

任何帮助将不胜感激,谢谢。

您可以使用purrrmap_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.tablepurrr 这是使用函数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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM