使用dplyr和tidyr计算分组data.frame的平均值

使用dplyr和tidyr计算分组data.frame的平均值,r,dplyr,average,tidyr,nested-datalist,R,Dplyr,Average,Tidyr,Nested Datalist,我只是在学习R,并试图找到修改分组的数据.frame的方法,以便获得变量值的平均值(x+y/2),以及内聚观测值的标准偏差(sd)sqrt((x^2+y^2)/2)。其他(相等)变量(序列,值1)不应更改 我使用了subset()和rowMeans(),但我想知道是否有更好的方法使用dplyr和tidyr(可能使用嵌套的数据帧?) 我的test data.frame看起来像: my test data.frame的dput输出: dplyr的groupby和summary将有所帮助,同时gsub

我只是在学习R,并试图找到修改分组的
数据.frame
的方法,以便获得变量
值的平均值
(x+y/2),以及内聚观测值的标准偏差(
sd
)sqrt((x^2+y^2)/2)。其他(相等)变量(
序列
值1
)不应更改

我使用了
subset()
rowMeans()
,但我想知道是否有更好的方法使用
dplyr
tidyr
(可能使用嵌套的数据帧?)

我的test data.frame看起来像: my test data.frame的dput输出:
dplyr的
groupby
summary
将有所帮助,同时
gsub对字符串变量提供了一些支持:

library(dplyr)

myData %>% 
  group_by(id) %>% 
  summarise(
    location = gsub(".*_", "", location[1]),
    value = mean(value),
    sd = mean(sd),
    sequence = sequence[1],
    value1 = value1[1]
  )
#> # A tibble: 5 × 6
#>       id location value    sd sequence value1
#>   <fctr>    <chr> <dbl> <dbl>   <fctr>  <int>
#> 1  anon1     nose   5.0  0.20        a      1
#> 2  anon2     body   4.0  0.40        a      2
#> 3  anon3      arm   4.0  0.45        a      3
#> 4  anon4     head   4.0  0.30        a      4
#> 5  anon5      leg   1.5  0.15        a      5

非常感谢,这帮了大忙。我只是想知道我如何计算标准偏差的正确平均值(即sqrt((sd1^2+sd2^2)/2),它是否类似于sd=sqrt((sd[1]^2+sd[2]^2)/2)如果这是你想做的计算,那么它会起作用。你可以将它推广到n个值,如
sd=sqrt(sum(sd^2)/n())
。无论如何,我都不知道为什么
mean()
还不够吗?
myData <- structure(list(ï..id = structure(c(1L, 2L, 3L, 3L, 4L, 5L, 5L
), .Label = c("anon1", "anon2", "anon3", "anon4", "anon5"), class = "factor"), 
    location = structure(c(5L, 1L, 3L, 6L, 2L, 4L, 7L), .Label = c("body", 
    "head", "left_arm", "left_leg", "nose", "right_arm", "right_leg"
    ), class = "factor"), value = c(5L, 4L, 3L, 5L, 4L, 2L, 1L
    ), sd = c(0.2, 0.4, 0.3, 0.6, 0.3, 0.2, 0.1), sequence = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L), .Label = "a", class = "factor"), 
    value1 = c(1L, 2L, 3L, 3L, 4L, 5L, 5L)), .Names = c("ï..id", 
"location", "value", "sd", "sequence", "value1"), class = "data.frame", row.names = c(NA, 
-7L))
id      location value sd   sequence value1
"anon1" "nose"   5     0.2  "a"      1 
"anon2" "body"   4     0.4  "a"      2
"anon3" "arm"    4     0.47 "a"      3
"anon4" "head"   4     0.3  "a"      4
"anon5" "leg"    1.5   0.15 "a"      5
library(dplyr)

myData %>% 
  group_by(id) %>% 
  summarise(
    location = gsub(".*_", "", location[1]),
    value = mean(value),
    sd = mean(sd),
    sequence = sequence[1],
    value1 = value1[1]
  )
#> # A tibble: 5 × 6
#>       id location value    sd sequence value1
#>   <fctr>    <chr> <dbl> <dbl>   <fctr>  <int>
#> 1  anon1     nose   5.0  0.20        a      1
#> 2  anon2     body   4.0  0.40        a      2
#> 3  anon3      arm   4.0  0.45        a      3
#> 4  anon4     head   4.0  0.30        a      4
#> 5  anon5      leg   1.5  0.15        a      5
myData %>% 
  group_by(id, sequence, value1) %>% 
  summarise(
    location = gsub(".*_", "", location[1]),
    value = mean(value),
    sd = mean(sd))
#> Source: local data frame [5 x 6]
#> Groups: id, sequence [?]
#> 
#>       id sequence value1 location value    sd
#>   <fctr>   <fctr>  <int>    <chr> <dbl> <dbl>
#> 1  anon1        a      1     nose   5.0  0.20
#> 2  anon2        a      2     body   4.0  0.40
#> 3  anon3        a      3      arm   4.0  0.45
#> 4  anon4        a      4     head   4.0  0.30
#> 5  anon5        a      5      leg   1.5  0.15