我试图根据逻辑表达式在R中选择一个子集,包括3个不同的变量。具体来说,当t >= ts
和t <= te
(基本上,当t E [ts,te])时,我想为每个group
选择一个子集。
示例数据:
t <- c(1,2,3,4,5,-1,2,3,4,5,6)
ts<- c(2,2,2,2,2,-1,-1,-1,-1,-1,-1)
te <- c(4,4,4,4,4,5,5,5,5,5,5)
group <-c(1,1,1,1,1,2,2,2,2,2,2)
v<-c(1,2,4,5,1,1,3,2,4,4,1)
dt <- data.frame(cbind(t,ts,te,group,v))
所需输出:
t <- c(2,3,4,-1,2,3,4,5)
ts<- c(2,2,2,-1,-1,-1,-1,-1)
te <- c(4,4,4,5,5,5,5,5)
group <-c(1,1,1,2,2,2,2,2)
v<-c(2,4,5,1,3,2,4,4)
dt1 <- data.frame(cbind(t,ts,te,group,v))
我试着:
dt1<-dt %>%
group_by(group) %>% subset(dt, "t" >= "ts" & "t" <= "te")
但是我得到了错误:
sub - set.data.frame(., dt, "t"祝辞="ts","t"<= "子集"必须是逻辑的
我也尝试了我在这里看到的一些帖子的解决方案:
criteria <- c("t >= ts", "t <= te")
dt1<-dt %>%
group_by(group) %>% subset(dt, eval(parse(text = criteria)))
但是我仍然得到:
sub - set.data.frame(., dt, eval(parse(text = criteria)))错误:
'子集'必须是逻辑的
你知道我可能做错了什么吗?多谢
这会产生您想要的输出:
# your dataframe
t <- c(1,2,3,4,5,-1,2,3,4,5,6)
ts<- c(2,2,2,2,2,-1,-1,-1,-1,-1,-1)
te <- c(4,4,4,4,4,5,5,5,5,5,5)
group <-c(1,1,1,1,1,2,2,2,2,2,2)
v<-c(1,2,4,5,1,1,3,2,4,4,1)
dt <- data.frame(cbind(t,ts,te,group,v))
# your desired output
desired_output <- subset(dt, t >= ts & t <= te)
Edit: as Ben suggested: if you want to make it with dplyr use filter
desired_output<-dt %>%
group_by(group) %>%
filter(t >= ts & t <= te)