数据帧中的向量平均值

时间:2016-10-31 17:50:41

标签: r vector apply mean lapply

我正在尝试创建一个新数据框,它是一系列向量的精简版本。

虽然我的数据构建类似

mat <- matrix(1:18, 6) 
g <- c("a", "a", "b", "b", "c", "c")
df <- cbind(g, mat)

我想实现

result_df喜欢

a 1.5 7.5 13.5
b 3.5 9.5 15.5
c 5.5 11.5 17.5

当我尝试for循环时遇到麻烦,有没有办法lapply()或apply()可以原生地执行此操作?有更简单的解决方案吗?

2 个答案:

答案 0 :(得分:2)

另一个可能对未来需求更灵活的选择是使用MATCH (m:Movie {id: 123}) OPTIONAL MATCH p=(m)-->() DELETE p; 。这需要数据在data.frame中,但听起来就像你所拥有的那样。

dplyr

df <- data.frame(g, mat) df %>% group_by(g) %>% summarise_all(mean) 列分组,然后取所有剩余列的平均值。它返回:

g

我认为这是你期望的结果。如果与 g X1 X2 X3 1 a 1.5 7.5 13.5 2 b 3.5 9.5 15.5 3 c 5.5 11.5 17.5 结合使用,也可以通过将它们放在长格式中来更轻松地使用/访问这些方法

tidyr

返回:

df %>%
  gather(Measurement, Value, -g) %>%
  group_by(g, Measurement) %>%
  summarise(mean = mean(Value))

答案 1 :(得分:1)

我有两个选项,具体取决于您是先要先进行行操作还是先进行列操作。

第一列选项将使用<head> <base href="https://polygit.org/polymer+1.7.0/components/"> <script src="webcomponentsjs/webcomponents-lite.min.js"></script> <link rel="import" href="polymer/polymer.html"> <link rel="import" href="paper-menu/paper-menu.html"> <link rel="import" href="paper-item/paper-item.html"> </head> <body> <x-foo></x-foo> <dom-module id="x-foo"> <template> <paper-menu> <template is="dom-repeat" items="[[items]]"> <paper-item data-page$="[[item.name]]" sectionid$="[[item.id]]">[[item.name]]</paper-item> </template> </paper-menu> </template> </dom-module> </body>循环遍历所有列,然后使用lapply按列查找每列的平均值。

tapply

行优先选项会将数据帧按行拆分为多个组,然后使用as.data.frame(lapply(dat, tapply, INDEX = g, mean)) 查找每个子数据帧的列均值。

sapply

如果您有一个矩阵## implicit splitting do.call(rbind, by(dat, g, sapply, mean)) ## explicit splitting do.call(rbind, lapply(split(dat, g), sapply, mean)) 而不是数据框,我们也可以这样做

mat

apply(mat, 2L, tapply, INDEX = g, mean)

测试数据

do.call(rbind, by(mat, g, colMeans))