通过条件分组和逻辑进行搜索?

时间:2018-09-15 19:25:30

标签: r

我是新手,正在学习R。我正在尝试提出一个我不知道该词的问题。 假设我有一个数据框,这样:

df<-data.frame(ID=c("A","A","A","B","B","B","C","C","C"),
Week=c(1,2,3,1,2,3,1,2,3),
Variable=c(30,25,27,42,44,45,30,50,19))



  ID Week Variable
1  A    1       30
2  A    2       25
3  A    3       27
4  B    1       42
5  B    2       44
6  B    3       45
7  C    1       30
8  C    2       50
9  C    3       19

对于第1周变量= 30的所有ID,我如何找到第2周的平均变量?

例如,我希望本例中的输出为37.5

3 个答案:

答案 0 :(得分:1)

这可能更易于阅读/查看。

library(tidyverse)

df %>% 
  spread(Week, Variable) %>%
  filter(`1` == 30) %>%
  with(mean(`2`))

[1] 37.5

我认为tidyverse代码更易于理解,因为您可以像读取任何非代码文本一样从左到右阅读它。管道%>%使查看操作顺序更加容易,不再需要括号来解释。

答案 1 :(得分:0)

首先我们需要ID,其中有variable=30 AND week=1的条目,然后从ID的{​​{1}}中提取ID,并进行{ {1}}

Base R解决方案:

Week=2

输出:

avg(Variable)

OR(另一种方法)

使用mean(df[df$ID %in% (df[df$Week==1 & df$Variable==30,1]) & df$Week==2,3])

[1] 37.5

输出:

sqldf

答案 2 :(得分:0)

步骤1: 获取第1周的Variable = 30的ID

Integer.toHexString()

输出为:

res<-  subset( df,Variable==30 & Week==1, ID ) 

第2步:  在第2周获取所有变量:

> res
  ID
1  A
7  C

输出为:

dt<-subset(df,ID %in% as.vector(unlist(res))  & Week==2  ,select=c(ID,Variable))

步骤3: 求平均值:

  ID Variable
2  A       25
8  C       50

最终输出是:

  mean(dt$Variable)

在步骤2中,我们有37.5 那是什么意思?

%in%部分只是一个运算符,如果它在右侧向量内找到ID,则会返回例如,运行以下示例:

ID %in% as.vector(unlist(res))

结果是:

  a<- 1:10

  b<-c(0,4,6,8,16)

  b %in% a

因此,%in%运算符为FALSE TRUE TRUE TRUE FALSE 的每个元素返回一个布尔值。 如果该元素存在于 b中,则结果为True,否则返回 False 。如您所见,0和16为False。

但是,要点是,a应该是向量,而ares,因此,我需要首先data.frame,然后将其视为unlistvector)。

最后,as.vector检查每个ID是否存在res。