如何使用group_by(dplyr)访问data.frame的所有元素?

时间:2015-05-11 23:02:58

标签: r dplyr

假设我们有一个data.frame'df':

 speed dist lan
      4    2 "bra"
      4   10 "bra"
      7    4 "bra"
      7   22 "col"
      8   16 "col"
      9   10 "col"
     10   18 "fin"
             ...

我想实现一些关于速度和dist groupin_by lan的操作,例如,尝试打印一些值。 我该怎么做?

我尝试过这种方式,但我无法取得成功:

df %>%
  group_by(lan) %>%
  (function(.) {
      print(.$speed)
      print(.$dist)
  })

1 个答案:

答案 0 :(得分:1)

您应该使用do作为上述评论中建议的@ r2evans。但通常最好只返回原始data.frame,这样您就可以继续使用它了。例如,在你的情况下,你可能想要计算平均速度和平均值dist:

df %>%
  group_by(lan) %>%
  do({
    cat("lan = ", .$lan[1], "\n")
    print(.$speed)
    print(.$dist)
    .
  }) %>% 
  summarise(mean(speed), mean(dist))

这样我就可以显示输出,这是mtcars的一个例子。

mtcars %>% 
  group_by(cyl) %>% 
  do({cat("cyl = ", .$cyl[1], "\n")
      print(.$mpg) 
      print(.$wt) 
      .}) %>% 
  summarise(mean(mpg), mean(wt))
## cyl =  4 
##  [1] 22.8 24.4 22.8 32.4 30.4 33.9 21.5 27.3 26.0 30.4 21.4
##  [1] 2.320 3.190 3.150 2.200 1.615 1.835 2.465 1.935 2.140 1.513 2.780
## cyl =  6 
## [1] 21.0 21.0 21.4 18.1 19.2 17.8 19.7
## [1] 2.620 2.875 3.215 3.460 3.440 3.440 2.770
## cyl =  8 
##  [1] 18.7 14.3 16.4 17.3 15.2 10.4 10.4 14.7 15.5 15.2 13.3 19.2 15.8  15.0
##  [1] 3.440 3.570 4.070 3.730 3.780 5.250 5.424 5.345 3.520 3.435 3.840 3.845 3.170 3.570
## Source: local data frame [3 x 3]
## 
##   cyl mean(mpg) mean(wt)
## 1   4  26.66364 2.285727
## 2   6  19.74286 3.117143
## 3   8  15.10000 3.999214