首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何最有效地创建几个基于组的新变量?

如何最有效地创建几个基于组的新变量?
EN

Stack Overflow用户
提问于 2018-11-26 14:50:46
回答 2查看 38关注 0票数 1

让我们使用以下示例:

代码语言:javascript
复制
set.seed(2409)
N=5
T=10
id<- rep(LETTERS[1:N],each=T)
time<-rep(1:T, times=N)
var1<-runif(N*T,0,100)
var2<-runif(N*T,0,100)
var3<-runif(N*T,0,100)
var4<-runif(N*T,0,100)
var5<-runif(N*T,0,100)
df<-data.frame(id,time,var1,var2,var3,var4,var5); rm(N,T,id,time,var1,var2,var3,var4,var5)

我现在尝试为其中的几个变量执行一个函数(而不是整个变量系列!)并相应地创建新变量。

我已经有了一个适当的代码来创建日志变量。为此,我将使用以下代码:

代码语言:javascript
复制
cols <- c("var1", 
          "var3",
          "var5")
log <- log(df[cols])
colnames(log) <- paste(colnames(log), "log", sep = "_")
df <- cbind(df,log); rm(log, cols)

这将给我额外的日志变量。但是现在我也想要创建滞后变量和z转换变量。这些函数引用单个ID。因此,我编写了下面的代码,当然可以工作,但是在我的实际数据集中,它非常长而且效率很低,其中我将函数应用于38个变量(每个变量):

代码语言:javascript
复制
library(Hmisc)
library(dplyr)
df<-df %>%
  group_by(id) %>%
  mutate(var1_1=Lag(var1, shift=1),
         var3_1=Lag(var3, shift=1),
         var5_1=Lag(var5, shift=1),
         var1_2=Lag(var1, shift=2),
         var3_2=Lag(var3, shift=2),
         var5_2=Lag(var5, shift=2),
         var1_z=scale(var1),
         var3_z=scale(var3),
         var5_z=scale(var5)
         )

我深信亦有办法提高这方面的效率。如果我能够定义原始变量一次并执行不同的函数并因此创建新的变量,这将是可取的。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-26 14:57:59

您可以将mutate_atfuns结合使用。这将将funs中的三个函数应用于vars中的三个变量中的每一个,从而创建9个新列。

代码语言:javascript
复制
library(dplyr)

df %>%
  group_by(id) %>%
  mutate_at(vars(var1, var3, var5),
            funs(lag1 = lag(.), lag2 = lag(., 2), scale))

# # A tibble: 50 x 16
# # Groups:   id [5]
#    id     time   var1  var2   var3  var4  var5 var1_lag1 var3_lag1 var5_lag1
#    <fct> <int>  <dbl> <dbl>  <dbl> <dbl> <dbl>     <dbl>     <dbl>     <dbl>
#  1 A         1 38.8   25.7  29.2    91.1  35.3    NA        NA          NA  
#  2 A         2 87.1   22.3   8.27   31.5  93.7    38.8      29.2        35.3
#  3 A         3 61.7   38.8   0.887  63.0  50.4    87.1       8.27       93.7
#  4 A         4  0.692 60.1  71.5    74.0  41.6    61.7       0.887      50.4
#  5 A         5 60.1   13.3  90.4    80.6  47.5     0.692    71.5        41.6
#  6 A         6 46.4    3.67 36.7    86.9  67.5    60.1      90.4        47.5
#  7 A         7 80.4   72.1  82.2    25.5  70.3    46.4      36.7        67.5
#  8 A         8 48.8   25.7  93.4    19.8  81.2    80.4      82.2        70.3
#  9 A         9 48.2   31.5  82.1    47.2  49.2    48.8      93.4        81.2
# 10 A        10 21.8   32.6  76.5    19.7  41.1    48.2      82.1        49.2
# # ... with 40 more rows, and 6 more variables: var1_lag2 <dbl>, var3_lag2 <dbl>,
# #   var5_lag2 <dbl>, var1_scale <dbl>, var3_scale <dbl>, var5_scale <dbl>
票数 1
EN

Stack Overflow用户

发布于 2018-11-26 18:23:14

下面是data.table的一个选项

代码语言:javascript
复制
library(data.table)
nm1 <- c('var1', 'var3', 'var5')
nm2 <- paste0(nm1, rep(c('_lag1', '_lag2'), each = 3))
nm3 <- paste0(nm1, '_scale')
setDT(df)[, c(nm2, nm3) := c(shift(.SD, n = 1:2), lapply(.SD, 
          function(x) as.vector(scale(x)))), by = id, .SDcols = nm1]'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53483667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档