Tengo un data.frame como este:

Points      Assists      Steals
Player A    Player B     Player B
Player B    Player C     Player A
player C    Player C     Player A

Y estoy tratando de obtener una salida de data.frame como esta:

           Points     Assists      Steals
Player A    1          0            2
Player B    1          1            1
Player C    1          2            0

Como puede ver, quiero que cuente la cantidad de veces que cada jugador aparece en cada categoría. Puedo hacer esto para una columna usando table(), pero no puedo averiguar cómo hacerlo para varias columnas. ¿Cómo haría esto?

r
1
orangeman51 13 nov. 2017 a las 08:34

2 respuestas

La mejor respuesta

Podemos gather en formato largo, obtener count y spread en formato ancho

library(dplyr)
library(tidyr)
gather(df1) %>% 
     count(key, value) %>%
     spread(key, n, fill = 0)
# A tibble: 3 x 4
#     value Assists Points Steals
#*    <chr>   <dbl>  <dbl>  <dbl>
#1 Player A       0      1      2
#2 Player B       1      1      1
#3 Player C       2      1      0

O usamos melt con table

library(reshape2)
table(melt(as.matrix(df1))[3:2])
#         Var2
#value      Points Assists Steals
#  Player A      1       0      2
#  Player B      1       1      1
#  Player C      1       2      0

Datos

df1 <- structure(list(Points = c("Player A", "Player B", "Player C"), 
Assists = c("Player B", "Player C", "Player C"), Steals = c("Player B", 
"Player A", "Player A")), .Names = c("Points", "Assists", 
"Steals"), class = "data.frame", row.names = c(NA, -3L))
1
akrun 13 nov. 2017 a las 05:53

Aquí está el detalle de la solución akrun para el paquete data.table. Es posible tener una sola línea, pero la amplié a varios pasos comprensibles.

library(data.table)
DT <- setDT(df1)
DT[,id := 1:.N]
plouf <- melt(DT, id.var = c("id"))
dcast(plouf, value ~variable)

Da

      value Points Assists Steals
1: Player A      1       0      2
2: Player B      1       1      1
3: Player C      1       2      0
0
denis 13 nov. 2017 a las 15:03