假设我有一个包含 10+1 列和 10 行的数据帧,除了一列("分组"列 A(之外,每个值都具有相同的单位。 我正在尝试完成以下操作:给定基于最后一列的数据帧分组,如何将整个块的标准偏差计算为单个整体变量。
假设我进行分组(实际上它是间隔的cut
(:
df %>% group_by(A)
根据我收集到的这个网站,您可以使用聚合或其他 dplyr 方法来计算每列的方差,即: 这个(如果我有 <10 次,SO 不会让我嵌入(。 在那张图片中,我们可以看到分组为颜色,但是通过使用聚合,我将在每个指定的列中获得 1 个标准差(我知道您可以使用cbind
获得超过 1 个变量,例如aggregate(cbind(V1,V2)~A, df, sd)
(和每个组(以及使用dplyr
和%>%
的类似方法,最后附加summarise(..., FUN=sd)
(。
然而,我想要的是:就像在 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 解决方案,请尝试以下操作。
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")