我正在尝试确定一种有效的方法,根据变量中各部分的长度列表,收集数据框中变量子部分的均值和标准差。这是我所拥有的数据类型的一个小例子。
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的每个唯一序列的某些功能而不在本地执行。
答案 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)
首先,我假设您要创建一个包含两列X1
和X2
的数据框。以下是创建数据框的方法。
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
然后我们可以使用data.table包计算每组的平均值和标准差。关键是使用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