【发布时间】:2019-11-27 20:50:21
【问题描述】:
我有一个类似于下面创建的DataSetA 的数据框。观察代表在每个人的长度上对相同的 3 个变量进行的测量。在个人(A、B、C 等)内,每个观察与前一个观察的距离相等。为了澄清,在真实数据中,每个人的长度是不同的。因此,每个变量(Var1、Var2、Var3)的索引数量相同,但每个人之间不同(Individual A 可能有 50 个观察值,但 Individual B 可能有 70 个) .
我有兴趣比较个体之间从每个个体的不同位置开始的等长数据。因此,我凭经验检测每个人体内的单个“兴趣点”(单个索引),并希望收集该点和之前的 9 个点,以便在个人之间进行比较。
我需要对数据进行子集化,最终得到一个新的数据框,其中包含每个人的十个观察值,格式与原始数据框相同。在过去,我通过 Tidyverse(如下所示)对每个人使用过滤器和切片函数来完成此操作,并使用 rbind 将它们组合到新的数据帧中。然而,这样做需要在我的代码中大量重复(和时间),并且我的数据集正在增长。
我想为每个人创建一个单独的对象,该对象具有一行和两列,其中包含个人 ID 和他们“兴趣点”的相应索引。基本上我想说; “如果数据集A 中的id 与数据集B 中的id 匹配,则数据集B 中ID 旁边的数字是我希望R 开始的行的索引在数据集A(兴趣点)中,并在新数据框中返回该行和它之前的九行”。
我不确定 for 循环是否是执行此操作的合适方法,或者是否还有其他方法。任何帮助将不胜感激。
Individuals <- rep(c("A","B","C"), each = 50)
Var1 <- rnorm(50)
Var2 <- rnorm(50)
Var3 <- rnorm(50)
DataSetA <- cbind(Individuals, Var1, Var2, Var3)
DataSetA <- data.frame(DataSetA)
#How I usually filter to achieve what I want:
#The point of interest for Individual A is the 32nd observation taken on
#Individual A, so I need observations 23:32
A <-
DataSetA%>%
filter(Individuals == A)%>%
slice(23:32)
#The point of interest for Individual B is the 35th observation taken on
#Individual B, so I need observations 26:35
#note that this is the 35th observation for that individual (not the 35th observation of the data set)
B <-
DataSetA%>%
filter(Individuals == B)%>%
slice(26:35)
#The point of interest for Individual C is the 16th observation taken on
#Individual B, so I need observations 7:16
C <-
DataSetA%>%
filter(Individuals == C)%>%
slice(7:16)
#I then have to combine them using rbind
ExtractedData <- rbind(A,B,C)
#Below creates what I would like to use as "dataset B" to tell R what number to start filtering at in DataSetA
Individuals <- c("A","B","C")
PointOfInterest <- c(32,35,16)
DataSetB <- data.frame(Individuals, PointOfInterest)
【问题讨论】: