R do的控制输出格式

R do的控制输出格式,r,dplyr,R,Dplyr,以下两个do语句提供的结果略有不同: library(dplyr) set.seed(1) d <- data.frame(x = rnorm(30), y = rnorm(30), w = factor(sample(3, 30, TRUE))) (r1 <- d %>% group_by(w) %>% do(data.frame(s1 = sum(.$x), s2 = sum(.$y), s3

以下两个
do
语句提供的结果略有不同:

library(dplyr)
set.seed(1)
d <- data.frame(x = rnorm(30), y = rnorm(30), w = factor(sample(3, 30, TRUE)))

(r1 <- d %>% group_by(w) %>%
   do(data.frame(s1 = sum(.$x),
                 s2 = sum(.$y),
                 s3 = {
                    z <- seq_along(.$x)
                    sum(z)
                 })))
# Source: local data frame [3 x 4]
# Groups: w [3]
# 
#        w        s1         s2    s3
#   (fctr)     (dbl)      (dbl) (int)
# 1      1 0.1292572  0.8447634    45
# 2      2 0.2092895  3.3060157    91
# 3      3 2.1351984 -0.1675416    36

(r2 <- d %>% group_by(w) %>%
   do(s1 = sum(.$x),
      s2 = sum(.$y),
      s3 = {
         z <- seq_along(.$x)
         sum(z)
      }))
# Source: local data frame [3 x 4]
# Groups: <by row>
# 
#        w       s1       s2       s3
#   (fctr)    (chr)    (chr)    (chr)
# 1      1 <dbl[1]> <dbl[1]> <int[1]>
# 2      2 <dbl[1]> <dbl[1]> <int[1]>
# 3      3 <dbl[1]> <dbl[1]> <int[1]>
编辑

这个问题显然不再有效,因为在我当前的
dplyr
版本中,我得到的是
list
而不是
chr


最后,为什么
s1
s2
s3
在类型
(chr)
的第二个示例中?

将模型包装在
列表中
,并防止R尝试用
I
取消列表

r3 <- d %>% group_by(w) %>%
    do(data.frame(s1 = I(list(lm(y ~ x, .))),
                  s2 = sum(.$y),
                  s3 = {
                     z <- seq_along(.$x)
                     sum(z)
                  }))

#Source: local data frame [3 x 4]
#Groups: w [3]

#       w      s1         s2    s3
#  (fctr)   (chr)      (dbl) (int)
#1      1 <S3:lm>  0.8447634    45
#2      2 <S3:lm>  3.3060157    91
#3      3 <S3:lm> -0.1675416    36
r3%分组依据(w)%>%
do(数据帧(s1=I(列表(lm(y~x,))),
s2=总和(.$y),
s3={

太好了,这就是我要找的。在明天之前不能给赏金。
r3 %>% mutate(s2 = unlist(s2), s3 = unlist(s3))
# Source: local data frame [3 x 4]
# Groups: <by row>
# 
#        w      s1         s2    s3
#   (fctr)   (chr)      (dbl) (int)
# 1      1 <S3:lm>  0.8447634    45
# 2      2 <S3:lm>  3.3060157    91
# 3      3 <S3:lm> -0.1675416    36
r3 <- d %>% group_by(w) %>%
    do(data.frame(s1 = I(list(lm(y ~ x, .))),
                  s2 = sum(.$y),
                  s3 = {
                     z <- seq_along(.$x)
                     sum(z)
                  }))

#Source: local data frame [3 x 4]
#Groups: w [3]

#       w      s1         s2    s3
#  (fctr)   (chr)      (dbl) (int)
#1      1 <S3:lm>  0.8447634    45
#2      2 <S3:lm>  3.3060157    91
#3      3 <S3:lm> -0.1675416    36