density - xlab size in r




깔끔한 사고로 확산되는 방법 (2)

다음과 같은 데이터 프레임이 있어야합니다.

other=data.frame(name=c("a","b","a","c","d"),result=c("Y","N","Y","Y","N"))

tidyr 또는 다른 함수에서 spread 함수를 사용하여 결과 Y 또는 N의 수를 이처럼 열 헤더로 가져 오는 방법은 무엇입니까?

name       Y   N
a          2   0
b          0   1

감사


다음은 많은 사람들이 그것에 대해 알아볼 수있는 몇 가지 방법입니다.

1) 라이브러리 dplyr 사용하여 간단히 그룹화하고 필요한 형식으로 계산할 수 있습니다.

library(dplyr)
other %>% group_by(name) %>% summarise(N = sum(result == 'N'), Y = sum(result == 'Y'))
Source: local data frame [4 x 3]

    name     N     Y
  <fctr> <int> <int>
1      a     0     2
2      b     1     0
3      c     0     1
4      d     1     0

2) 다음과 같이 tidyr tabletidyr 의 조합을 사용할 수 있습니다.

library(tidyr)
spread(as.data.frame(table(other)), result, Freq)
  name N Y
1    a 0 2
2    b 1 0
3    c 0 1
4    d 1 0

3) dplyrtidyr 의 조합을 사용하여 다음과 같이 할 수 있습니다.

library(dplyr)
library(tidyr)
spread(count(other, name, result), result, n, fill = 0)
Source: local data frame [4 x 3]
Groups: name [4]

    name     N     Y
  <fctr> <dbl> <dbl>
1      a     0     2
2      b     1     0
3      c     0     1
4      d     1     0

dcast 를 사용하는 또 다른 옵션이 있습니다.

library(data.table)
dcast(setDT(other), name~result, length)
#    name N Y
#1:    a 0 2
#2:    b 1 0
#3:    c 0 1
#4:    d 1 0

table(other) 는 @ mtoto의 주석에서 나온 콤팩트 옵션이지만 큰 데이터 세트의 경우 dcast 를 사용하는 것이 더 효율적일 수 있습니다. 아래에 몇 가지 벤치 마크가 나와 있습니다.

set.seed(24)
other1 <- data.frame(name = sample(letters, 1e6, replace=TRUE), 
    result = sample(c("Y", "N"), 1e6, replace=TRUE), stringsAsFactors=FALSE)

other2 <- copy(other1)

gopala1 <- function() other1 %>% 
                          group_by(name) %>%
                          summarise(N = sum(result == 'N'), Y = sum(result == 'Y'))
gopala2 <- function() spread(as.data.frame(table(other1)), result, Freq)
gopala3 <- function() spread(count(other1, name, result), result, n, fill = 0)
akrun <- function() dcast(as.data.table(other2), name~result, length)


library(microbenchmark)
microbenchmark(gopala1(), gopala2(), gopala3(),
                    akrun(), unit='relative', times = 20L)
#      expr      min       lq     mean   median       uq      max neval
# gopala1() 2.710561 2.331915 2.142183 2.325167 2.134399 1.513725    20
# gopala2() 2.859464 2.564126 2.531130 2.683804 2.720833 1.982760    20
# gopala3() 2.345062 2.076400 1.953136 2.027599 1.882079 1.947759    20
#   akrun() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000    20




tidyr