微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 data.table 和 for 循环为多列创建表

如何解决使用 data.table 和 for 循环为多列创建表

我需要使用 data.table 来加速代码。我被困在如何引用从向量索引的变量上。

数据:

df <- data.frame(
  id=c(1,1,2,3,3),year=as.character(c(2014,2015,2016,NA,2016)),code=c(1,4,5),dv1=1:9,dv2=2:10
) %>% as.data.table()

dtplyr 代码

cols <- c("dv1","dv2")

test <- function(data,columns,group) {
for(i in seq_along(columns)) {
 sub1 <- df %>% 
   select("id",columns[i],group) %>%
   group_by(.data[[group]]) %>%
   summarise(mean=mean(.data[[columns[i]]],na.rm=T),sd=sd(.data[[columns[i]]],na.rm=T)) %>%
   ungroup() %>%
   as_tibble() 
 print(sub1)
}
}

data.table 尝试:

test <- function(data,group) {
  for(i in seq_along(columns)) {
    sub1 <- df %>% 
      .[,.(id,group)] %>%
      .[,.(mean(.data[[columns[i]]],na.rm=T)),by=.data[[group]]] %>%
      as_tibble() 
    print(sub1)
  }
}

test(data=df,columns=cols,group="year")

这适用于单个变量:

df %>% 
  .[,dv1,year)] %>%
  .[,.(mean(dv1,sd=sd(dv1,by=year] %>%
  as_tibble() 

解决方法

  • <!DOCTYPE html> <html> <head> <title</title> <link href="style.css" rel="stylesheet"> </head> <body> <div class="wrapper"> <div id="box1"> <p>Box1</p> </div> <div id="box2"> <div class="box2" id="box2-1"> <p>Box2</p> </div> <div class="box2" id="box2-2"> <p>Box3</p> </div> </div> </div> </body> </html> 未在 .data
  • 中使用
  • 此处您不需要 data.table,这就是您在 select 版本中也不需要 .[,.(id,columns[i],group)] 的原因。
  • 您可以使用 data.table 根据字符串获取列值。

因为这只是一个例子,所以我没有尝试简化循环,以便您以后可以在其中添加更复杂的内容。

get
,

这可能需要一个相当不直观的 as.list/unlist 构造:


df <- data.frame(
  id=c(1,1,2,3,3),year=as.character(c(2014,2015,2016,NA,2016)),code=c(1,4,5),dv1=1:9,dv2=2:10
) %>% as.data.table()

summary.func <- function(x) {
    list( mean=mean(x),sd=sd(x) )
}

df[,as.list(unlist(lapply(.SD,summary.func))),by=group,.SDcols=cols ]

它产生:


   year dv1.mean    dv1.sd dv2.mean    dv2.sd
1: 2014 1.000000        NA 2.000000        NA
2: 2015 3.666667 1.5275252 4.666667 1.5275252
3: 2016 6.000000 3.0000000 7.000000 3.0000000
4: <NA> 7.500000 0.7071068 8.500000 0.7071068

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。