http://stackoverflow.com/questions/22523131
์ด๊ฒ์ ๋ํ ์ธํฐํ์ด์ค๊ฐ ๋ฌด์์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ์๋ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก drop = FALSE๋ก ์ค์ ๋์ด์ผ ํฉ๋๋ค.
์ด ํธ๋ฅผ ์ด์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. Hadley.
:+1: ์ค๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. drop = FALSE
๋ ์ ์๊ฒ ํฐ ๋์์ด ๋ ๊ฒ์
๋๋ค!
.drop = FALSE๋ฅผ dplyr์ ๋ฃ๋ ์๊ฐ ํ๋ ์์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? ํน์ rCharts๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋งํ๋ ค๋ฉด ์ด๊ฒ์ด ํ์ํฉ๋๋ค.
๊ทธ ๋์ ๋๋ ์๋ํ๋ ๋งํฌ์์ ๋ต์ ์ป์์ต๋๋ค.
http://stackoverflow.com/questions/22523131
๋ ๊ฐ์ ๋ณ์๋ก ๊ทธ๋ฃนํํ์ต๋๋ค.
๋น ๊ทธ๋ฃน์ ์ญ์ ํ์ง ์๋ ์ต์ ์ ๋ํด +1
#486 ๋ฐ #413๊ณผ ์ผ๋ถ ์ค๋ณต๋ ์ ์์ต๋๋ค.
๋น ๊ทธ๋ฃน์ ์ญ์ ํ์ง ์์ผ๋ฉด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์์ฝ ํ ์ด๋ธ์ ์์ฑํ ๋ ์ข ์ข ํ์ํฉ๋๋ค.
+1 - ์ด๊ฒ์ ๋ง์ ๋ถ์์ ๋ํ ๊ฑฐ๋ ์ฐจ๋จ๊ธฐ์ ๋๋ค.
๋๋ ์์ ๋ชจ๋ ๊ฒ์ ๋์ํฉ๋๋ค. ๋งค์ฐ ์ ์ฉํ ๊ฒ์ ๋๋ค.
@romainfrancois ํ์ฌ build_index_cpp()
๋ drop ์์ฑ์ ์กด์คํ์ง ์์ต๋๋ค.
t1 <- data_frame(
x = runif(10),
g1 = rep(1:2, each = 5),
g2 = factor(g1, 1:3)
)
g1 <- grouped_df(t1, list(quote(g2)), drop = FALSE)
attr(g1, "group_size")
# should be c(5L, 5L, 0L)
attr(g1, "indices")
# shoud be list(0:4, 5:9, integer(0))
drop ์์ฑ์ ์์ธ๋ณ๋ก ๊ทธ๋ฃนํํ ๋๋ง ์ ์ฉ๋๋ฉฐ, ์ด ๊ฒฝ์ฐ ์์ค์ด ์ค์ ๋ก ๋ฐ์ดํฐ์ ์ ์ฉ๋๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์์ธ ์์ค๋น ํ๋์ ๊ทธ๋ฃน์ด ํ์ํฉ๋๋ค.
์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋จ์ผ ํ ์ด๋ธ ๋์ฌ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
select()
: ํจ๊ณผ ์์arrange()
: ํจ๊ณผ ์์summarise()
: 0 ํ ๊ทธ๋ฃน์ ์ ์ฉ๋๋ ํจ์์๋ 0 ์์ค ์ ์๊ฐ ์ฃผ์ด์ ธ์ผ ํฉ๋๋ค. n()
๋ 0์ ๋ฐํํด์ผ ํ๊ณ , mean(x)
๋ NaN์ ๋ฐํํด์ผ ํฉ๋๋ค.filter()
: ์ผ๋ถ ๊ทธ๋ฃน์ ํ์ด ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฃน ์งํฉ์ ์ผ์ ํ๊ฒ ์ ์ง๋์ด์ผ ํฉ๋๋ค.mutate()
: ๋น ๊ทธ๋ฃน์ ๋ํ ํํ์์ ํ๊ฐํ ํ์๊ฐ ์์ต๋๋ค.๊ฒฐ๊ตญ drop = FALSE
๊ฐ ๊ธฐ๋ณธ๊ฐ์ด ๋๋ฉฐ drop = FALSE
์ drop = TRUE
๋ธ๋์น๋ฅผ ๋ชจ๋ ์์ฑํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋กญ๋ค๋ฉด ๊ธฐ๊บผ์ด drop = FALSE
์ง์์ ์ค๋จํ๊ฒ ์ต๋๋ค( ํญ์ ์์์ ๋ ๋ฒจ์ ์ง์ ์กฐ์ ํ๊ฑฐ๋ ๋์ ๋ฌธ์ํ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ด ๋ผ? ์์ ์ด ๋ง์ ๊ฒฝ์ฐ 0.4๋ก ๋ฏธ๋ฃฐ ์ ์์ต๋๋ค.
@statwonk , @wsurles , @jennybc , @slackline , @mcfrank , @eipi10 ๋์์ด ๋๋ค๋ฉด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ค์ํ ๋์ฌ๊ฐ ์ํธ ์์ฉํ ์ ์๋ ๋ชจ๋ ๋ฐฉ์์ ์ฐ์ตํ๋ ํ ์คํธ ์ผ์ด์ค ์ธํธ์์ ์์ ํ๋ ๊ฒ์ ๋๋ค. ๊ธธ์ด๊ฐ 0์ธ ๊ทธ๋ฃน์ด ์์ต๋๋ค.
์. drop
๊ฐ ๋ฌด์์ ํด์ผ ํ๋์ง ๋ชฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ถ๋ช
ํด์ง๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ง์ ์ผ์ด๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค.
์์ ๋จ์ผ ํ ์ด๋ธ ๋์ฌ๊ฐ ๊ธธ์ด๊ฐ 0์ธ ๊ทธ๋ฃน์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ ์คํธํ๋ pull ์์ฒญ #833์ ์ด์์ต๋๋ค. ๋ฌผ๋ก dplyr์ด ํ์ฌ ํ ์คํธ์ ์คํจํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ํ ์คํธ๋ ์ฃผ์ ์ฒ๋ฆฌ๋์ด ์์ต๋๋ค.
+1, ์ฌ๊ธฐ์ ์ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฌ๋ ์์ฝ, ๋น ์์ค์ ์ ์งํด์ผํฉ๋๋ค!
@ebergelson , ๊ธธ์ด๊ฐ 0์ธ ๊ทธ๋ฃน์ ์ป๊ธฐ ์ํ ํ์ฌ ํดํน์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ด ๋ง๋ ์ฐจํธ๊ฐ ์์ผ ์ ์๋๋ก ์ข ์ข ํ์ํฉ๋๋ค.
์ฌ๊ธฐ์ df์๋ ์ด๋ฆ, ๊ทธ๋ฃน ๋ฐ ์ธก์ ํญ๋ชฉ์ 3๊ฐ ์ด์ด ์์ต๋๋ค.
df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
left_join(df, by=c("name","group")) %>%
mutate(metric = ifelse(is.na(metric),0,metric))
๋น์ทํ ์์
์ ์ํํฉ๋๋ค. ๋๋ฝ๋ ๊ทธ๋ฃน์ด ์๋์ง ํ์ธํ ๋ค์ ๋ชจ๋ ์กฐํฉ์ด ์์ผ๋ฉด left_join
์์ฑํฉ๋๋ค.
๋ถํํ๋, ์ด ๋ฌธ์ ๊ฐ ๋ง์ ์ฌ๋์ ๋ฐ๊ณ ์๋ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค. ์๋ง๋ ์ด ๊ฐ๋จํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค.
@wsurles , @bpbond ๊ฐ์ฌํฉ๋๋ค. ์, ๊ทํ๊ฐ ์ ์ํ ๊ฒ๊ณผ ์ ์ฌํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค! .drop๊ณผ ๊ฐ์ ๋ด์ฅ ์์ ํ๋ก๊ทธ๋จ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
์์ ๋ชจ๋ ์ฌ๋์ ์ถ๊ฐํ๊ณ ๋์ํ๊ธฐ ์ํด ์ด๊ฒ์ ๋ง์ ๋ถ์์์ ๋งค์ฐ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ๊ตฌํ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
์ฌ๊ธฐ์ ํ์ํ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ๋ณด:
๋ด๊ฐ ์ด๊ฒ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด :
> df <- data_frame( x = c(1,1,1,2,2), f = factor( c(1,2,3,1,1) ) )
> df
Source: local data frame [5 x 2]
x f
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1
๊ทธ๋ฆฌ๊ณ x
๋ค์ f
๊ทธ๋ฃนํํ๋ฉด (2, 2)
๋ฐ (2,3)
์ด ๋น์ด ์๋ 6(2x3) ๊ทธ๋ฃน์ผ๋ก ๋๋ฉ๋๋ค. ๊ด์ฐฎ์. ๋๋ ๋ด๊ฐ ์๊ฐํ๋ ๊ฒ์ ์คํํ ์ ์๋ค.
์ด์ ๋ด๊ฐ ์ด๊ฒ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
> df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )
> df
Source: local data frame [4 x 2]
f x
1 1 1
2 1 2
3 2 1
4 2 4
f
๋ค์ x
๋ก ๊ทธ๋ฃนํํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฃน์ ๋ฌด์์
๋๊น? @ํด๋ค๋ฆฌ
stats::aggregate
๋ฐ plyr::ddply
๋ ๋ชจ๋ ์ด ๊ฒฝ์ฐ 4๊ฐ์ ๊ทธ๋ฃน(1,1; 1,2; 2,1; ๋ฐ 2,4)์ ๋ฐํํ๋ฏ๋ก ๋ค์์ ์ค์ํด์ผ ํฉ๋๋ค. .
๋์ table()
๋์ํด์ผ ํ์ง ์์ต๋๊น? ์ฆ, 9๊ฐ์ ๊ทธ๋ฃน์ ๋ฐํํด์ผ ํฉ๋๊น?
> table(df$f, df$x)
1 2 4
1 1 1 0
2 1 0 1
3 0 0 0
df %>% group_by(f, x) %>% tally
๋ ๊ธฐ๋ณธ์ ์ผ๋ก with(df, as.data.frame(table(f, x)))
๋ฐ ddply(df, .(f, x), nrow, .drop=FALSE)
์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋์์ ๊ธธ์ด๊ฐ 0์ธ ๊ทธ๋ฃน์ ์์(์: plyr์ .drop)๋ก ์ ์งํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ @huftis ์ ์ ์์ ์ํ๋ค๊ณ ์์ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ๋์์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ๊ธฐ๋ณธ๊ฐ์ drop = TRUE๋ก ์ ์ํฉ๋๋ค. @bpbond ์ ์ ์์ ๋๋ค.
ํ , ์ ํํ ์ด๋ค ํ๋์ ์ทจํด์ผ ํ๋์ง ๋จธ๋ฆฌ๋ฅผ ๊ฐ์ธ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ด ๋งค์ฐ ๊ฐ๋จํ ์ฌ๊ณ ์คํ์ด ์ ํํด ๋ณด์ ๋๊น?
df <- data_frame(x = 1, y = factor(1, levels = 2))
df %>% group_by(x) %>% summarise(n())
#> x n
#> 1 1
df %>% group_by(y) %>% summarise(n())
#> y n
#> 1 1
#> 2 0
df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 1 2 0
ํ์ง๋ง x
์ ์ฌ๋ฌ ๊ฐ์ด ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๋ฐ ์์ผ๋ก ์๋ํด์ผ ํฉ๋๊น?
df <- data_frame(x = 1:2, y = factor(1, levels = 2))
df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 2 1 1
#> 1 1 0
#> 2 2 0
๋น ๊ทธ๋ฃน์ ์ ์งํ๋ ๊ฒ์ ๋จ์ผ ๋ณ์๋ก ๊ทธ๋ฃนํํ ๋๋ง ์๋ฏธ๊ฐ ์์๊น์? ์๋ฅผ ๋ค์ด data_frame(age_group = c(40, 60), sex = factor(M, levels = c("F", "M"))
์ ๊ฐ์ด ์ข ๋ ํ์ค์ ์ผ๋ก ๊ตฌ๋๋ฅผ ์ก์ผ๋ฉด ์ฌ์ฑ์ ์๋ฅผ ๊ณ์ฐํ์๊ฒ ์ต๋๊น? ๊ทธ๋ด ๋๋ ์๊ณ ์ ํ ๋๋ ์์ ๊ฒ ๊ฐ์์. ๋ชจ๋ ์กฐํฉ์ ํ์ฅํ๋ ๊ฒ์ ๋์๊ฒ ๋ค์ ๋ค๋ฅธ ์์
์ฒ๋ผ ๋ณด์
๋๋ค(๊ทธ๋ฆฌ๊ณ ์์ธ์ ์ฌ์ฉ๊ณผ๋ ๋ณ๊ฐ๋ก).
group_by
์๋ drop
๋ฐ expand
์ธ์๊ฐ ๋ชจ๋ ํ์ํ ๊น์? drop = FALSE
๋ ๋ฐ์ดํฐ์ ๋ํ๋์ง ์๋ ์์ธ ์์ค์ ์ํด ์์ฑ๋ ๋ชจ๋ ํฌ๊ธฐ 0 ๊ทธ๋ฃน์ ์ ์งํฉ๋๋ค. expand = TRUE
๋ ๋ฐ์ดํฐ์ ํ์๋์ง ์๋ ๊ฐ ์กฐํฉ์ผ๋ก ์์ฑ๋ ๋ชจ๋ ํฌ๊ธฐ 0 ๊ทธ๋ฃน์ ์ ์งํฉ๋๋ค.
@hadley ๊ทํ์ ์๋ ๋์๊ฒ ์ณ์ต๋๋ค ( levels = 1:2
๊ฐ ์๋ levels = 2
levels = 1:2
๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ). ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ๋ณ์๋ก ๊ทธ๋ฃนํํ ๋๋ ๋น ๊ทธ๋ฃน์ ์ ์งํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณ์๊ฐ sex
( male
๋ฐ female
) ๋ฐ answer
(์ง๋ฌธ์์ disagree
, neutral
, agree
), ๊ฐ ์ฑ๋ณ์ ๋ํ ๊ฐ ๋ต๋ณ์ ๋น๋๋ฅผ ๊ณ์ฐํ๋ ค๋ ๊ฒฝ์ฐ(์: ํ
์ด๋ธ ๋๋ ๋์ค์ ํ๋กํ
ํ๊ธฐ ์ํด) ์ฌ์ฑ์ด ๋๋ตํ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ํ ์์ธ ๋ณ์๊ฐ ๊ฒฐ๊ณผ data_frame
(๋ฌธ์์ด๋ก ๋ณํ๋์ง ์์) ๋ฐ _์๋ ์์ค_์์ ์์ธ ๋ณ์๋ก ๋จ์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. (๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฆด ๋ ๋ต๋ณ ๋ฒ์ฃผ๋ ์ํ๋ฒณ agree
, disagree
, neutral
์๋ ์ฌ๋ฐ๋ฅธ ์์๋ก ์ ๋ ฌ๋ฉ๋๋ค.)
๋ง์ง๋ง ์์ ๊ฒฝ์ฐ sex
๋ณ์๋ฅผ _์ด๋ค ๊ฒฝ์ฐ์๋_ ์ญ์ ํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค(์: _์๋์ ์ผ๋ก_ ์ฌ์ฑ์ ์กฐ์ฌํ์ง ์์ ๊ฒฝ์ฐ). ๋ค๋ฅธ ๊ฒฝ์ฐ์๋_ ๊ทธ๋ ์ง ์์ต๋๋ค(์: ์ฑ๋ณ(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ฐ๋)). ๊ทธ๋ฌ๋ ์ด๊ฒ์ _after_ ๋ฐ์ดํฐ ์ง๊ณ๋ก ์ฝ๊ฒ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. (๋ค๋ฅธ ํด๊ฒฐ์ฑ
์ _vector-valued_ .drop
์ธ์๋ฅผ ๋ฐ์๋ค์ด๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ฉด ์ข๊ฒ ์ง๋ง ์ํฉ์ด ๋ณต์กํด์ง ์ ์์ต๋๋ค.)
(๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ ๋ฒกํฐ ๊ฐ .drop ์ธ์๋ฅผ ๋ฐ์๋ค์ด๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ข๊ฒ ์ง๋ง ๋ฌธ์ ๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค.)
์, ์๋ง๋ ๋๋ฌด ๋ณต์กํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด @huftis ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค.
@ํด๋ค๋ฆฌ
์ ์๊ฐ์๋
YES๋ ๊ฐ์ ๋ชจ๋ ์กฐํฉ์ด ๋ฐ์ดํฐ์ ์๋ ๊ฒฝ์ฐ group_by๋ก ํ์ฅ๋ฉ๋๋ค.
NO๋ ์กด์ฌํ์ง ์๋ ์์ธ ์์ค์์ ํ์ฅํ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ์ฌ์ฉ ์ฌ๋ก๋ ์ฐจํธ์ ๋ํ ์์ฝ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ค๋นํ๋ ๊ฒ์ ๋๋ค(ํ์ ์ค). ๊ทธ๋ฆฌ๊ณ ์ฐจํธ์๋ ๋ชจ๋ ๊ฐ ์กฐํฉ์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ทธ๋ฃน์ ๋ํด 0์ธ ์์ธ ์์ค์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ ์กฐํฉ ์์ด ๋ง๋ ์ฐจํธ๋ฅผ ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ์ ์กด์ฌํ์ง ์๋ ์์ ๊ฐ์ ํ์ํ์ง ์์ต๋๋ค. ์์ด๋ฉด 0์ด๊ณ ๋ฒ๋ก์๋ ๋น ๊ฐ์ด ๋ฉ๋๋ค.
๋ชจ๋ ๊ฐ์ group_by๋ก ํ์ฅํ๋ ๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ๊ทธ๋ฃน ๋ค์์ 0๊ฐ์ ์ผ์ด์ค๋ฅผ ํํฐ๋งํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ๊ณ (ํจ์ฌ ๋ ์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.) ๋๋ .drop ์ธ์๊ฐ ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ฉด ์ดํ์ 0๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ํํฐ๋งํ๊ธฐ์ ์ถฉ๋ถํ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ํจ์์ ์ถ๊ฐ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ํ์ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ group_by๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ธฐ์กด ๊ฐ์ ๋ชจ๋ ์ฝค๋ณด์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๋ ๊ฒ์ด์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๊ธฐ๋ณธ ๋์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ณ ์ ํญ๋ชฉ์ ๋ชจ๋ ์์ ์์ค์ด ์๋๋ผ ์์์ ๊ธฐ์กด ๊ฐ์์๋ง ํ์ฅ๋ฉ๋๋ค. (์ด๊ฒ์ 0 ๊ฐ์ ๋จ์ด ๋จ๋ฆฌ๋ group_by๋ฅผ ์คํ ํ ํ ์คํํ๋ ๊ฒ์ ๋๋ค)
## Expand data so plot groups works correctly
df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
left_join(df, by=c("name","group")) %>%
mutate(
measure = ifelse(is.na(measure),0,measure)
)
๋ชจ๋ ๊ทธ๋ฃน์ 0์ด ์๋๋ผ๋ ๊ฐ์ ์ํ๋ ์์น๋ฅผ ์ ์ ์๋ ์ ์ผํ ๊ฒฝ์ฐ๋ ์๊ฐ ๋ฐ์ดํฐ์ ๋๋ค. ์ค๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋ ๋ ์ด ์์ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ ์ง ๋ฒ์์ ๋ํ ํ์ฅ ๋ฐ ์กฐ์ธ์ ์ฌ์ ํ โโํ์ํฉ๋๋ค. ์์ธ ์์ค์ ๊ฒฝ์ฐ๋ ์ ์ฉ๋์ง ์์ต๋๋ค. ๋ฐ์ดํฐ ํฌ๋ฐ์ฒ๊ฐ ๋๋ฝ๋ ๋ ์ง๋ฅผ ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ณต์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ชจ๋ ํ๋ฅญํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ ์ง์ ์ 90%๋ dplyr๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. : )
@huftis์ ์ ๊ทน ๋์ํฉ๋๋ค.
๋๋ ์์ค์ ํ๋ฝ์ด๋ ์์ค์ ์กฐํฉ์ด ๋ฐ์ดํฐ์ ๊ด๋ จ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์์ ์ํ์ ์ฌ์ฉํ์ฌ ํจ์๋ ๊ทธ๋ฆผ์ ํ๋กํ ํ์ดํํ ์ ์์ต๋๋ค. ๋๋ split-apply-combine ์์ ์ ์ํํ๋ ๊ฒฝ์ฐ ๊ฐ ๊ทธ๋ฃน์ ์ถ๋ ฅ์ด ๋๋จธ์ง ๋ชจ๋ ํญ๋ชฉ๊ณผ ์ผ์นํ๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค.
๋ด ์ ์ฅ์ ๋ถ๋๋ฝ๊ฒ ํ๊ธฐ: ๊ทธ๋ฃนํ ๋ณ์๊ฐ ์ด๋ฏธ ์ ์ ํ ์์์ผ ๋์ ์์๋ก ๊ฐ์ ๋ ๋ ๊ธฐ๋ณธ ๋์์ด ๋ฌ๋ผ์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉํ์ง ์์ ์์ค์ ์ ์งํด์ผ ํ๋ ์๋ฌด๊ฐ ๊ฐ์ ์ ๊ฒฝ์ฐ์ ๋ ์ ์ ์ ์์์ ์ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ์์ธ์ผ๋ก ์ค์ ํ๊ณ ๋ ๋ฒจ์ ์ ์ดํ๊ธฐ ์ํด ์๊ณ ๋ฅผ ํ๋ค๋ฉด ... ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ด๋งํ ์ด์ ๊ฐ ์๊ณ ๊ทธ๊ฒ์ ์ ์งํ๊ธฐ ์ํด ๋์์์ด ์ธ์ฐ๊ณ ์ถ์ง ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ์ ๋ ์ด ๊ธฐ๋ฅ์ ๋ณด๊ณ ์ถ์ต๋๋ค. @huftis๊ฐ ์ค๋ช ํ ๊ฒ๊ณผ ์ ์ฌํ ์๋๋ฆฌ์ค๊ฐ ์์ผ๋ฉฐ ํ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ํํ๋ฅผ
SO์์ ์ฌ๊ธฐ๋ก ์์ต๋๋ค. ์ด๊ฒ์ด "tidyr"์ complete
์ด(๊ฐ) ๋์์ผ ํ๋ ๊ฒ ์๋๋๊น?
๋ค, ๊ทธ๋ ์ต๋๋ค. ๋๋ ์ค์ ๋ก ์ต๊ทผ์ '์์ '์ ๋ํด ๋ฐฐ์ ๊ณ ์ฌ๋ ค ๊น์ ๋ฐฉ์์ผ๋ก ์ด๊ฒ์ ๋ฌ์ฑํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
SQL ๋ฐฑ์๋์ ๋ํด ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ทธ๋ฃน์ ์ญ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ ๋ณด์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ทธ๋๋ก ๋๊ณ ์๋ง๋ SQL์ ๋ํด Tidyr::complete()๋ฅผ ๊ตฌํํ ๊น์?
์ด ๋ฌธ์ ๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ค๋ ์ฌ์ค์ ๊นจ๋ซ์ง ๋ชปํ ์ฑ ๋ฌธ์ #3033์ ๋ง๋ค์์ต๋๋ค. ์ค๋ณต๋ ์ ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ด ์์ ์ ๊ฒธ์ํ ์ ์์ ์ถ๊ฐํ๊ธฐ ์ํด ํ์ฌ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก pull()
๋ฐ forcats::fct_count()
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
fct_count()
๋ ํญ์ ์
๋ ฅ๊ณผ ๋์ผํ ์ ํ์ธ ์ถ๋ ฅ์ ๋ง๋๋ ๊น๋ํ ์๋ฆฌ๋ฅผ ๋ฐฐ๋ฐํ๊ธฐ ๋๋ฌธ์(์ฆ, ์ด ํจ์๋ ๋ฒกํฐ์์ ํฐ๋ธ์ ์์ฑํฉ๋๋ค) ์ ๋ ์ด ๋ฐฉ๋ฒ์ ํฌ์ด ์๋๋๋ค. ์ถ๋ ฅ์ ์ด ์ด๋ฆ์ ๋ณ๊ฒฝํฉ๋๋ค. ์ด๊ฒ์ dplyr::count()
๊ฐ ํ๋๋ฅผ ๋ฎ์ ์์ ์ธ ๊ฒฝ์ฐ pull() %>% fct_count() %>% rename()
๊ฐ์ ๋จ๊ณ( forcats::fct_count()
์ dplyr::count()
๊ฐ ์ด๋ป๊ฒ๋ ํฉ์ณ์ง๊ณ forcats::fct_count()
๋ ์ด์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ํ์์ ์ผ ๊ฒ์
๋๋ค.
tidyr::complete()
์ ์์ธ์ ๋ํด ์๋ํฉ๋๊น?
๋ชจ๋ ์์ธ ์์ค ๋ฐ ์์ธ ์์ค ์กฐํฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค. ์ด ๋์์ drop
, expand
๋ฑ๊ณผ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ์ ์ดํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ dplyr::count()
์ ๊ธฐ๋ณธ ๋์์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
df <- data.frame(x = 1:2, y = factor(c(1, 1), levels = 1:2))
df %>% dplyr::count(x, y)
#> # A tibble: 4 x 3
#> x y n
#> <int> <fct> <int>
#> 1 1 1 1
#> 2 2 1 1
#> 3 1 2 0
#> 4 2 2 0
๊ธธ์ด๊ฐ 0์ธ ๊ทธ๋ฃน(๊ทธ๋ฃน ์กฐํฉ)์ ๋์ค์ ํํฐ๋งํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์์ ๋ถ์์ ์ํด์๋ ์ ์ฒด ๊ทธ๋ฆผ์ ๋ด์ผ ํฉ๋๋ค.
2: ๋ค ํ์คํ
1: ์ด ๋ฌธ์ ์ ๋ํด ๊ธฐ์ ์ ์ธ ๊ตฌํ์์ ์ด๋ ค์์ด ์์ง๋ง ์์ผ๋ก ๋ช ์ฃผ ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ค ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฅํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
library(tidyverse)
truly_group_by <- function(data, ...){
dots <- quos(...)
data <- group_by( data, !!!dots )
labels <- attr( data, "labels" )
labnames <- names(labels)
labels <- mutate( labels, ..index.. = attr(data, "indices") )
expanded <- labels %>%
tidyr::expand( !!!dots ) %>%
left_join( labels, by = labnames ) %>%
mutate( ..index.. = map(..index.., ~if(is.null(.x)) integer() else .x ) )
indices <- pull( expanded, ..index..)
group_sizes <- map_int( indices, length)
labels <- select( expanded, -..index..)
attr(data, "labels") <- labels
attr(data, "indices") <- indices
attr(data, "group_sizes") <- group_sizes
data
}
df <- data_frame(
x = 1:2,
y = factor(c(1, 1), levels = 1:2)
)
tally( truly_group_by(df, x, y) )
#> # A tibble: 4 x 3
#> # Groups: x [?]
#> x y n
#> <int> <fct> <int>
#> 1 1 1 1
#> 2 1 2 0
#> 3 2 1 1
#> 4 2 2 0
tally( truly_group_by(df, y, x) )
#> # A tibble: 4 x 3
#> # Groups: y [?]
#> y x n
#> <fct> <int> <int>
#> 1 1 1 1
#> 2 1 2 1
#> 3 2 1 0
#> 4 2 2 0
๋ถ๋ช ํ ๋ผ์ธ์ ๋ฐ๋ผ ์ด๊ฒ์ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์๋ ์ง๋ฌธ์ ์ฒ๋ฆฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
> df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
> df$b = factor(df$b, levels=1:3)
> df %>%
+ group_by(b) %>%
+ summarise(count_a=length(a), .drop=FALSE)
# A tibble: 2 x 3
b count_a .drop
<fct> <int> <lgl>
1 1 6 FALSE
2 2 6 FALSE
> df %>%
+ truly_group_by(b) %>%
+ summarise(count_a=length(a), .drop=FALSE)
# A tibble: 3 x 3
b count_a .drop
<fct> <int> <lgl>
1 1 6 FALSE
2 2 6 FALSE
3 3 0 FALSE
์ฌ๊ธฐ์ ํต์ฌ์ ์ด๊ฒ์ด๋ค.
tidyr::expand( !!!dots ) %>%
๋ณ์๊ฐ ์์ธ์ธ์ง ์๋์ง์ ๊ด๊ณ์์ด ๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ํ์ฅํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ๋งํ ๊ฒ์ ๋๋ค :
drop=FALSE
์ผ ๋ ๋ชจ๋ ํ์ฅ , ์ ์ฌ์ ์ผ๋ก 0 ๊ธธ์ด ๊ทธ๋ฃน์ด ๋ง์ด ์์ ์ ์์ต๋๋ค.drop=TRUE
๊ฒฝ์ฐ ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ํ์ญ์์ค๋๋กญ์ ํ ๊ธํ๋ ๊ธฐ๋ฅ์ด ์์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ฉํ๋ฐ์ดํฐ ์กฐ์๋ง ํฌํจํ๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ์ ๋ ดํ ์์ ์ด๋ฏ๋ก R์์ ๋จผ์ ์ด ์์ ์ ์ํํ๋ ๊ฒ์ด ๋ ์ํํ ๊น์?
ํ์
จ์ต๋๊น crossing()
๋์ expand()
?
๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด build_index_cpp()
, ํนํ labels
๋ฐ์ดํฐ ํ๋ ์์ ์์ฑ์ "๋ง" ๋ณ๊ฒฝํ๋ฉด ๋๋ค๋ ๋ฐ ๋์ํ์ญ๋๊น?
drop = FALSE
์์๋ง ํ์ฅํ๋ ๊ฒ์ผ๋ก ์์ํ ์ ์์ต๋๊น? ๋๋ "์์ฐ์ค๋ฌ์ด" ๊ตฌ๋ฌธ์ ๊ณ ๋ คํ์ง๋ง, ์ด๊ฒ์ ๊ฒฐ๊ตญ ๋๋ฌด ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ถฉ๋ถํ ๊ฐ๋ ฅํ์ง ์์ ์๋ ์์ต๋๋ค):
group_by(data, crossing(col1, col2), col3)
์ ๋ชจ๋ ์กฐํฉ ์ฌ์ฉ : ์๋ฏธ col1
๋ฐ col2
, ๊ฑฐ๊ธฐ์ ์กฐํฉ ๊ธฐ์กด col3
.
์, ์ด๊ฒ์ build_index_cpp
๋ฐ labels
, indices
๋ฐ group_sizes
์์ฑ์ ์์ฑ์๋ง ์ํฅ์ ๋ฏธ์น๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. #3489์ ์ผ๋ถ๋ก ๊น๋ํ ๊ตฌ์กฐ
์ด ๋ ผ์์ "์ ์ผํ ํ์ฅ ์์ธ" ๋ถ๋ถ์ ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ์ต๋๋ค.
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
library(dplyr)
d <- data_frame(
f1 = factor( rep( c("a", "b"), each = 4 ), levels = c("a", "b", "c") ),
f2 = factor( rep( c("d", "e", "f", "g"), each = 2 ), levels = c("d", "e", "f", "g", "h") ),
x = 1:8,
y = rep( 1:4, each = 2)
)
f <- function(data, ...){
group_by(data, !!!quos(...)) %>%
tally()
}
f(d, f1, f2, x)
f(d, x, f1, f2)
f(d, f1, f2, x, y)
f(d, x, f1, f2, y)
ํ ์์๊ฐ ๋ฌด์๋๋ฉด f(d, f1, f2, x)
f(d, x, f1, f2)
์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ๋ ์ฌ๋๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
๋ํ ํฅ๋ฏธ๋ก์ด ์ :
f(d, f2, x, f1, y)
d %>% sample_frac(0.3) %>% f(...)
์์์ ๋ํด์๋ง ์ ์ฒด ํ์ฅ์ ๊ตฌํํ๋ค๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ๋ฌธ์๊ฐ ์๋ ๋ฐ์ดํฐ(๋ ผ๋ฆฌ์ ํฌํจ)์ ๊ฒฝ์ฐ ํด๋น ๋ฐ์ดํฐ ์ ํ์ ์์ํ๋ factor-like ํด๋์ค๋ฅผ ์ ์/์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ง๋ forcats์์ ์ ๊ณตํฉ๋๊น? ์ด๊ฒ์ ๋ฐ์ ์ด์ ์๋ ๊ฒ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
#3492์์ ๊ตฌํ ์งํ ์ค
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )
( res1 <- tally(group_by(df,f,x, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups: f [?]
#> f x n
#> <fct> <dbl> <int>
#> 1 1 1. 1
#> 2 1 2. 1
#> 3 1 4. 0
#> 4 2 1. 1
#> 5 2 2. 0
#> 6 2 4. 1
#> 7 3 1. 0
#> 8 3 2. 0
#> 9 3 4. 0
( res2 <- tally(group_by(df,x,f, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups: x [?]
#> x f n
#> <dbl> <fct> <int>
#> 1 1. 1 1
#> 2 1. 2 1
#> 3 1. 3 0
#> 4 2. 1 1
#> 5 2. 2 0
#> 6 2. 3 0
#> 7 4. 1 0
#> 8 4. 2 1
#> 9 4. 3 0
all.equal( res1, arrange(res2, f, x) )
#> [1] TRUE
all.equal( filter(res1, n>0), tally(group_by(df, f, x)) )
#> [1] TRUE
all.equal( filter(res2, n>0), tally(group_by(df, x, f)) )
#> [1] TRUE
2018-04-10์ reprex ํจํค์ง (v0.2.0)์ ์ํด ์์ฑ๋์์ต๋๋ค.
complete()
๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ์ฌ๋ถ์ ๊ดํด์๋ - ์๋์, ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด๋ค ์์ฝ์ด ๊ณ์ฐ๋๋ ๋น ๋ฒกํฐ์ ๋ํ ํ๋์ ์ฌ์ค ์ดํ์ ํจ์น๋์ง ์๊ณ ๋ณด์กด๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
data.frame(x=factor(1, levels=1:2), y=4:5) %>%
group_by(x) %>%
summarize(min=min(y), sum=sum(y), prod=prod(y))
# Should be:
#> x min sum prod
#> 1 4 9 20
#> 2 Inf 0 1
sum
๋ฐ prod
(๊ทธ๋ฆฌ๊ณ ๋ ์ ์ ๋ฒ์๋ก min
) (๋ฐ ๊ธฐํ ๋ค์ํ ํจ์)๋ ๋น ๋ฒกํฐ์ ๋ํด ๋งค์ฐ ์ ์ ์๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋์ค์ complete()
์ ํจ๊ป ์์ ์ด๋ฌํ ๋์์ ์ฌ์ ์ํ์ญ์์ค.
@kenahoo ์ดํด๊ฐ ์ min()
์ ๊ฒฝ๊ณ ์
๋๋ค.
library(dplyr)
data.frame(x=factor(1, levels=1:2), y=4:5) %>%
group_by(x) %>%
summarize(min=min(y), sum=sum(y), prod=prod(y))
#> # A tibble: 2 x 4
#> x min sum prod
#> <fct> <dbl> <int> <dbl>
#> 1 1 4 9 20
#> 2 2 Inf 0 1
min(integer())
#> Warning in min(integer()): no non-missing arguments to min; returning Inf
#> [1] Inf
sum(integer())
#> [1] 0
prod(integer())
#> [1] 1
2018-05-15์ reprex ํจํค์ง (v0.2.0)์ ์ํด ์์ฑ๋์์ต๋๋ค.
@romainfrancois ์ค
์ด ์ค๋๋ ๋ฌธ์ ๋ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ค๊ณ ์๊ฐ๋๋ฉด ์ ๋ฌธ์ (reprex ํฌํจ)๋ฅผ ์ ์ถํ๊ณ ์ด ๋ฌธ์ ์ ๋ํ ๋งํฌ๋ฅผ ์์ฑํ์ญ์์ค. https://reprex.tidyverse.org/
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
+1 - ์ด๊ฒ์ ๋ง์ ๋ถ์์ ๋ํ ๊ฑฐ๋ ์ฐจ๋จ๊ธฐ์ ๋๋ค.