在dplyr中使用“窗口”函数
我需要按顺序处理数据帧中的行,但需要查看某些行。以下是一个近似示例:在dplyr中使用“窗口”函数,r,dplyr,R,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] &l
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]
}
}
使用dplyr的正确方法是什么?试试看
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)
这里有一个方法。第一件事是使用ifelse在cond中添加A或B。然后,我从zoo包中使用了na.locf,以便用A或B填充na。我想在处理num之前分配一个临时组ID。我在data.table包中借用了rleid。使用临时组ID(即foo)对数据进行分组,我使用了row_number,这是dplyr包中的窗口函数之一。请注意,我试图通过选择foo来删除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
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
我加载了data.table库。但是,找不到函数rleid。Khashaa的代码似乎使用rle完成了相同的任务。我想知道,是否有一个purrr dplyr的方式来做这件事?谢谢。@user151410我认为rleid是data.table中最新的函数之一。如果你从Github下载开发版本,我相信你有这个功能。有没有办法在dplyr中复制na.locf?太好了。relid是使用cumsum实现的。试验[1]是否指第一组患者的首次观察?
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