使用dplyr / purrr而不是为循环掩盖多列和/或扩展行

问题描述 投票:0回答:1

基本上它的有关使用位掩码/二进制列和面向行的操作对一个数据表/帧:首先,为了构建从可以用来掩盖一个字符内矢量来表示选择的列的组合的逻辑矢量“什么”列被标记。其次,行扩张 - 给出一列的数量,prouce包含原始行数据复制是次数的数据表。

对于使用逐行位掩码,其使用purrr总结国旗:减少来连接的行所表示的标志,我无法找到一个简洁的方法在一%>%链,而不是一个单独的for循环做到这一点。我怀疑需要purrr ::地图,但我不能让它/语法正确。

该行扩展,嵌套的for循环具有令人震惊的表现,我无法找到dplyr / purrr来,按行,复制该行的每行给定次数的方式。地图和其他功能将需要产生和追加这,我不认为地图是能够多行。

下面的代码生成所需的输出 - 但,除了性能问题(特别是关于排扩张),我希望能够做到这一点的矢量化操作。

library(tidyverse)
library(data.table)
dt <- data.table(C1=c(0,0,1,0,1,0),
         C2=c(1,0,0,0,0,1),
         C3=c(0,1,0,0,1,0),
         C4=c(0,1,1,0,0,0),
         C5=c(0,0,0,0,1,1),
         N=c(5,2,6,8,1,3),
         Spurious = '')
flags <- c("Scratching Head","Screaming",
       "Breaking Keyboard","Coffee Break",
       "Giving up")

# Summarise states
flagSummary <- function(dt){
    interim <- dt %>%
            dplyr::mutate_at(vars(C1:C5),.funs=as.logical) %>%
    dplyr::mutate(States=c(""))

    for(i in 1:nrow(interim)){
        interim$States[i] <-
        flags[as.logical(interim[i,1:5])] %>%
        purrr::reduce(~ paste(.x, .y, sep = ","),.init="") %>%
        stringr::str_replace("^[,]","") }
      dplyr::select(interim,States,N) }

summary <- flagSummary(dt)
View(summary)

# Expand states
expandStates <- function(dt){
    interim <- dt %>%
    dplyr::mutate_at(vars(C1:C5), .funs=as.logical) %>%
    dplyr::select_at(vars(C1:C5,N)) %>%
    data.table::setnames(.,append(flags,"Count"))

    expansion <- interim[0,1:5]
    for(i in 1:nrow(interim)){
        for(j in 1:interim$Count[i]){
        expansion <- bind_rows(expansion, interim[i,1:5]) } }
      expansion }

expansion <- expandStates(dt)
View(expansion)

如前所述,代码会产生预期的结果。我“喜欢”看到相同的不诉诸for循环和同时能够以链的功能到初始发生变异/选择。

dplyr collapse purrr bitmask rowexpansion
1个回答
0
投票

至于expandStates功能的行扩张,答案就在这里Replicate each row of data.frame and specify the number of replications for each row?通过A5C1D2H2I1M1N2O1R2T1递上。

本质上,嵌套for循环简单地通过更换

interim[rep(rownames(interim[,1:5]),interim$Count),][1:5]

在我的“实际”的数据,这减少了用户SYSTIME从28.64秒0.06产生一些26000行。

© www.soinside.com 2019 - 2024. All rights reserved.