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