R中完整数据帧组的方差

问题描述 投票:0回答:1

假设我有一个10 + 1列和10行的数据帧,除了一列(“分组”列A)之外,每个值都有相同的单位。我正在尝试完成以下任务:给定基于最后一列的数据帧分组,如何将整个块的标准偏差计算为单个整体变量。

让我们说我做分组(实际上它是间隔的cut):

df %>% group_by(A)

从我收集到的这个网站,您可以使用聚合或其他dplyr方法来计算每列的方差,即:this(如果我有<10代表,那么我不会让我嵌入)。在那张图片中我们可以看到分组为颜色,但是通过使用聚合,我会得到每个指定列1个标准偏差(我知道你可以使用cbind获得多于1个变量,例如aggregate(cbind(V1,V2)~A, df, sd))和每组(和类似的方法使用dplyr%>%,最后加上summarise(..., FUN=sd))。

然而我想要的是this:就像在Matlab中一样

group1 = df(row_group,:) % row_group would be df(:,end)==1 in this case
stdev(group1(:)) % operator (:) is key here
% iterate for every group

我有理由以特定方式想要它,当然真正的数据框架比这个模拟示例更大。

最低工作示例:

df <- data.frame(cbind(matrix(rnorm(100),10,10),c(1,2,1,1,2,2,3,3,3,1)))
colnames(df) <- c(paste0("V",seq(1,10)),"A")

df %>% group_by(A) %>% summarise_at(vars(V1), funs(sd(.))) # no good
aggregate(V1~A, data=df, sd) # no good
aggregate(cbind(V1,V2,V3,V4,V5,V6,V7,V8,V9,V10)~A, data=df, sd) # nope
df %>% group_by(A) %>% summarise_at(vars(V1,V2,V3,V4,V5,V6,V7,V8,V9,V10), funs(sd(.))) # same as above...

结果应该是3个双打,每个都有组的sd(如果添加了足够的列,则应该接近1)。

r dplyr aggregate
1个回答
0
投票

如果您需要基本R解决方案,请尝试以下操作。

sp <- split(df[-1], cut(df$A, breaks=c(2.1)))
lapply(sp, function(x) var(unlist(x)))
#$`(0.998,2]`
#[1] 0.848707
#
#$`(2,3]`
#[1] 1.80633

我已将它编码为两行以使其更清晰但您可以避免创建sp并编写单行

lapply(split(df[-1], cut(df$A, breaks=c(2.1))), function(x) var(unlist(x)))

或者,对于另一种形式的结果,

sapply(sp, function(x) var(unlist(x)))
#(0.998,2]     (2,3] 
# 0.848707  1.806330

数据

set.seed(6322)    # make the results reproducible
df <- data.frame(cbind(matrix(rnorm(100),10,10),c(1,2,1,1,2,2,3,3,3,1)))
colnames(df) <- c(paste0("V",seq(1,10)),"A")
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.