我是新手,正在学习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
答案 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
应该是向量,而a
是res
,因此,我需要首先data.frame
,然后将其视为unlist
(vector
)。
最后,as.vector
检查每个ID是否存在res。