如何使用变量长度索引列表对矢量进行子集化

时间:2018-01-25 03:44:07

标签: r indexing aggregate-functions

我正在尝试确定一种有效的方法,根据变量中各部分的长度列表,收集数据框中变量子部分的均值和标准差。这是我所拥有的数据类型的一个小例子。

X1 <- c(1, 2.5, 3, .5, 1, 1.5, 3, 3.5, 4, 6, 8, 8, 6, 3, 4)
X2 <- c(0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1)
df <- c(X1, X2)
X3 <- list(3, 5, 4, 3)

我会注意到,我所拥有的数据是我继承的连续时间数据的大数据集的预处理结果,而列表(X3)表示X2的每个序列的长度。不幸的是,我需要向量的每个部分的均值和SD。我尝试使用aggregate()函数

aggregate(X1, by = list(X2), FUN = mean)

但是这段代码聚合了所有&#34; 0&#34;和&#34; 1&#34;值一起分为两个值。我需要4个值。

我无法弄清楚如何通过为每个单独的序列创建一个因子来捕获X2的每个唯一序列的某些功能而不在本地执行。

2 个答案:

答案 0 :(得分:2)

另一个选择是通过比较相邻元素来创建分组变量并获得累积和

library(dplyr)
data_frame(X1, X2) %>% 
      group_by(ID = cumsum(X2 != lag(X2, default = X1[1]))) %>% 
      summarise(MEAN = mean(X1), SD = sd(X1))
# A tibble: 4 x 3
#     ID  MEAN    SD
#  <int> <dbl> <dbl>
#1     1  2.17  1.04
#2     2  1.90  1.29
#3     3  6.50  1.91
#4     4  4.33  1.53

如果我们在&#39; X3&#39;中有多少元素,请使用rep创建分组变量并使用aggregate中的base R

do.call(data.frame, aggregate(X1 ~cbind(ID = rep(seq_along(X3),
     unlist(X3))), FUN = function(x) c(MEAN = mean(x), SD = sd(x))))
#  ID  X1.MEAN    X1.SD
#1  1 2.166667 1.040833
#2  2 1.900000 1.294218
#3  3 6.500000 1.914854
#4  4 4.333333 1.527525

答案 1 :(得分:1)

首先,我假设您要创建一个包含两列X1X2的数据框。以下是创建数据框的方法。

df <- data.frame(X1, X2)
df
#     X1 X2
# 1  1.0  0
# 2  2.5  0
# 3  3.0  0
# 4  0.5  1
# 5  1.0  1
# 6  1.5  1
# 7  3.0  1
# 8  3.5  1
# 9  4.0  0
# 10 6.0  0
# 11 8.0  0
# 12 8.0  0
# 13 6.0  1
# 14 3.0  1
# 15 4.0  1

然后我们可以使用包计算每组的平均值和标准差。关键是使用rleid函数创建每个组的ID。之后,我们可以总结数据。 df2是最终输出。只要您的数据框中有X3列,就不需要X2

# Load the package
library(data.table)

# Convert df to a data.table
setDT(df)

# Perform rhe analysis
df2 <- df[, ID := rleid(X2)][, .(MEAN = mean(X1), SD = sd(X1)), by = ID]

df2[]
#    ID     MEAN       SD
# 1:  1 2.166667 1.040833
# 2:  2 1.900000 1.294218
# 3:  3 6.500000 1.914854
# 4:  4 4.333333 1.527525