繁体   English   中英

在dplyr中使用'window'函数

[英]Using 'window' functions in dplyr

我需要按顺序处理数据帧的行,但需要回顾某些行。 这是一个近似的例子:

library(dplyr)
d <- data_frame(trial = rep(c("A","a","b","B","x","y"),2))
d <- d %>%
  mutate(cond = rep('', n()), num = as.integer(rep(0,n())))

for (i in 1:nrow(d)){
  if(d$trial[i] == "A"){
  d$num[i] <- 0
  d$cond[i] <- "A"
  }
else if(d$trial[i] == "B"){
  d$num[i] <- 0
  d$cond[i] <- "B"
  }
else{
  d$num[i] <- d$num[i-1] +1
  d$cond[i] <- d$cond[i-1]
  }
}

结果数据框看起来像

> d
Source: local data frame [12 x 3]

    trial cond num
 1      A    A   0
 2      a    A   1
 3      b    A   2
 4      B    B   0
 5      x    B   1
 6      y    B   2
 7      A    A   0
 8      a    A   1
 9      b    A   2
10      B    B   0
11      x    B   1
12      y    B   2

使用dplyr执行此操作的正确方法是什么?

dlpyr解决方案:

d %>% 
  group_by(i=cumsum(trial %in% c('A','B'))) %>% 
  mutate(cond=trial[1],num=seq(n())-1) %>% 
  ungroup() %>% 
  select(-i)

#    trial cond num
# 1      A    A   0
# 2      a    A   1
# 3      b    A   2
# 4      B    B   0
# 5      x    B   1
# 6      y    B   2
# 7      A    A   0
# 8      a    A   1
# 9      b    A   2
# 10     B    B   0
# 11     x    B   1
# 12     y    B   2

尝试

d %>% 
  mutate(cond = zoo::na.locf(ifelse(trial=="A"|trial=="B", trial, NA))) %>%
  group_by(id=rep(1:length(rle(cond)$values), rle(cond)$lengths)) %>% 
  mutate(num = 0:(n()-1))  %>% ungroup %>% 
  select(-id)

这是一种方式。 第一件事是使用ifelsecond添加A或B. 然后,我从zoo包中使用了na.locf() ,以便用A或B填充NA。我想在处理num之前分配一个临时组ID。 我在data.table包中借用了rleid() 使用临时组ID(即foo )对数据进行分组,我使用了row_number() ,这是dplyr包中的一个窗口函数。 请注意,我尝试删除fooselect(-foo) 但是,该专栏希望留下来。 我认为这可能与功能的兼容性有关。

library(zoo)
library(dplyr)
library(data.table)

d <- data_frame(trial = rep(c("A","a","b","B","x","y"),2))

mutate(d, cond = ifelse(trial == "A" | trial == "B", trial, NA),
          cond = na.locf(cond),
          foo = rleid(cond)) %>%
group_by(foo) %>%
mutate(num = row_number() - 1)

#   trial cond foo num
#1      A    A   1   0
#2      a    A   1   1
#3      b    A   1   2
#4      B    B   2   0
#5      x    B   2   1
#6      y    B   2   2
#7      A    A   3   0
#8      a    A   3   1
#9      b    A   3   2
#10     B    B   4   0
#11     x    B   4   1
#12     y    B   4   2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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