Calcular combinaciones únicas de valores en la trama de datos, y los valores de resumen

StackOverflow https://stackoverflow.com/questions/4697106

  •  11-10-2019
  •  | 
  •  

Pregunta

Me gustaría trabajar con combinaciones únicas de var1 y var2 en mi trama de datos:

foo <- data.frame(var1 = c(1,1,2,2,2,2,3,3,3,3,3,4,4,4,4),
                  var2 = c(1,1,1,1,2,2,1,1,2,2,2,2,2,3,3))

Como se ha observado, los resultados unique(foo) en esto:

      var1  var2
 1    1     1
 2    2     1
 3    2     2
 4    3     1
 5    3     2
 6    4     2
 7    4     3

A partir de las combinaciones únicas, ¿cómo consigo:

  • n, el número de ocurrencias de un valor var1 y
  • svar, la suma de los valores de cada valor var1 var2.

La salida podría tener este aspecto:

      var1  n    svar
1     1     1    1
2     2     2    3
3     3     2    3
4     4     2    5
¿Fue útil?

Solución

unique(foo) debe darle lo que está después aquí.

ACTUALIZACIÓN 2014: uso dplyr en lugar de plyr

Yo recomiendo mirar en el plyr biblioteca para otras tareas de tipo de agregación, o los equivalentes de base R de tapply(), aggregate() et al.

Mientras redundante para este ejercicio, así es como se usaría plyr:

library(plyr)
ddply(foo, .(var1), unique)

Tenga en cuenta que puede reemplazar único con cualquier número de funciones, como la búsqueda de la media y la desviación estándar de var2 este modo:

ddply(foo, .(var1), summarise, mean = mean(var2), sd = sd(var2))

Respuesta a editar

Ahora usted tiene un uso más legítimo para plyr(). Tomando lo que hemos aprendido desde arriba:

x <- unique(foo)

combinado con plyr:

ddply(x, .(var1), summarise, n = length(var2), sum = sum(var2))

deben darle lo que está después.

Otros consejos

espero que entiendo bien su pregunta, trate de:

unique(foo)

Después pregunta fue editada:

No hay que escribir lo mismo que @Chase, una solución muy simple, pero no demasiado elegante podría ser:

foo$var12 <- paste(foo$var1, foo$var2, sep='|')      # the two variables combined to one
table(foo$var12)                                     # and showing its frequencies

Y la salida es una tabla, por supuesto:

 1|1 2|1 2|2 3|1 3|2 4|2 4|3 
   2   2   2   2   3   2   2 

Las respuestas son diferentes de lo que el estado, pero confío en mi código más de lo que confío en su respuesta, y no puedo llevar yo a cometer el pecado de nombrar una variable "Total":

 newfoo <- data.frame(
                 var1=unique(foo$var1),
                 n = with(foo, tapply(var2, var1, length) ),
                 svar = with(foo, tapply(var2, var1, sum) ) )
 newfoo
#  var1 n svar
#1    1 2    2
#2    2 4    6
#3    3 5    8
#4    4 4   10

EDIT: (. No había en un principio descubierto lo de Chase hizo intentes decirme)

newfoo <- data.frame(
                  var1=unique(unique(foo)$var1),
                  n = with(unique(foo), tapply(var2, var1, length) ),
                  svar = with(unique(foo), tapply(var2, var1, sum) ) )

> newfoo
  var1 n svar
1    1 1    1
2    2 2    3
3    3 2    3
4    4 2    5
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top