Tabla dinámica simple para contar valores únicos

134

Esto parece una simple tabla dinámica para aprender. Me gustaría hacer un recuento de valores únicos para un valor particular en el que estoy agrupando.

Por ejemplo, tengo esto:

ABC   123
ABC   123
ABC   123
DEF   456
DEF   567
DEF   456
DEF   456

Lo que quiero es una tabla dinámica que me muestre esto:

ABC   1
DEF   2

La tabla dinámica simple que creo simplemente me da esto (un recuento de cuántas filas):

ABC   3
DEF   4  

Pero quiero el número de valores únicos en su lugar.

Lo que realmente estoy tratando de hacer es descubrir qué valores en la primera columna no tienen el mismo valor en la segunda columna para todas las filas. En otras palabras, "ABC" es "bueno", "DEF" es "malo"

Estoy seguro de que hay una manera más fácil de hacerlo, pero pensé en probar la tabla dinámica ...

usuario1586422
fuente
8
Tenga en cuenta que para las versiones recientes de Excel, esta respuesta es más conveniente.
Dennis Jaheruddin

Respuestas:

108

Inserte una tercera columna y en la celda C2pegue esta fórmula

=IF(SUMPRODUCT(($A$2:$A2=A2)*($B$2:$B2=B2))>1,0,1)

y copiarlo Ahora cree su pivote basado en la primera y tercera columna. Ver instantánea

ingrese la descripción de la imagen aquí

Siddharth Rout
fuente
+1 Creo que esto es un poco más fácil que mi solución porque no requiere un valor especial para la primera fila
lc.
2
Buena técnica No sabía sobre este. Puede hacer lo mismo con una función de matriz =IF(SUM((A$2:A2=A2)*(B$2:B2=B2)) > 1, 0, 1)(presione Ctrl-Shift-Enter al ingresar la fórmula para que se adquiera {}a su alrededor).
ErikE
Respuesta universal, que no requiere ninguna característica específica. Simplemente buenas fórmulas simples.
Alberto De Caro
¿Alguna idea sobre cómo extender esto a una situación con tres columnas?
tumultous_rooster
13
Tenga en cuenta que esta respuesta NO dará la solución correcta si filtra algunas de las filas con las opciones de tabla dinámica. Digamos que la primera fila está filtrada. ¡La suma de ABCs parecerá ser 0!
jarlemag
250

ACTUALIZACIÓN: puede hacer esto ahora automáticamente con Excel 2013. He creado esto como una nueva respuesta porque mi respuesta anterior en realidad resuelve un problema ligeramente diferente.

Si tiene esa versión, seleccione sus datos para crear una tabla dinámica, y cuando cree su tabla, asegúrese de que la opción 'Agregar estos datos al Modelo de datos' esté marcada (ver más abajo).

Marque la casilla junto a 'Agregar estos datos al modelo de datos'

Luego, cuando se abra su tabla dinámica, cree sus filas, columnas y valores normalmente. Luego, haga clic en el campo del que desea calcular el recuento distinto y edite la Configuración del valor del campo: Editar configuración de valor de campo

Finalmente, desplácese hacia abajo hasta la última opción y elija 'Conteo distinto'. Elija la opción 'Conteo distinto'

Esto debería actualizar los valores de su tabla dinámica para mostrar los datos que está buscando.

Meaghan Fitzgerald
fuente
55
@MichaelK es mucho mejor, si tienes Excel 2013
jrharshath
3
¿Se puede hacer esto también en las tablas dinámicas existentes, por lo que no necesitamos recrear más de 200 tablas para obtener acceso a la funcionalidad de recuento distintivo?
Louisa
12
Solo un FYI: si aún no ha guardado su archivo como un archivo Excel (.xlsx) (por ejemplo: abrió un archivo .csv), la opción "Agregar estos datos al Modelo de datos" está desactivada / atenuada . La solución simple es guardar el archivo como un archivo de Excel.
PonyEars
9
¿Esto no es compatible con Mac? Esta opción no aparece para mí. Estoy en la versión 15.27.
jkupczak
44
De hecho, esta opción no existe en una Mac, ya que los modelos de datos en general son una característica exclusiva de Windows.
Tomty
10

Me gustaría agregar una opción adicional a la mezcla que no requiere una fórmula pero que podría ser útil si necesita contar valores únicos dentro del conjunto en dos columnas diferentes. Usando el ejemplo original, no tenía:

ABC   123  
ABC   123  
ABC   123   
DEF   456  
DEF   567  
DEF   456  
DEF   456

y quiero que aparezca como:

ABC   1  
DEF   2

Pero algo más como:

ABC   123  
ABC   123  
ABC   123  
ABC   456  
DEF   123  
DEF   456  
DEF   567  
DEF   456  
DEF   456

y quería que apareciera como:

ABC  
   123    3  
   456    1  
DEF  
   123    1  
   456    3  
   567    1

Encontré que la mejor manera de obtener mis datos en este formato y luego poder manipularlos más fue usar lo siguiente:

ingrese la descripción de la imagen aquí

Una vez que seleccione 'Total acumulado en', elija el encabezado para el conjunto de datos secundario (en este caso, sería el encabezado o título de columna del conjunto de datos que incluye 123, 456 y 567). Esto le dará un valor máximo con el recuento total de elementos en ese conjunto, dentro de su conjunto de datos primario.

Luego copié estos datos, los pegué como valores, luego los puse en otra tabla dinámica para manipularlos más fácilmente.

Para su información, tenía alrededor de un cuarto de millón de filas de datos, por lo que funcionó mucho mejor que algunos de los enfoques de fórmula, especialmente aquellos que intentan comparar entre dos columnas / conjuntos de datos porque seguía bloqueando la aplicación.

Meaghan Fitzgerald
fuente
Tuve un problema completamente diferente, pero esta respuesta me señaló en la dirección correcta. Gracias.
jtolle
esta respuesta se ajusta a mi necesidad, ya que tengo 500,000 filas que necesito para aplicar la fórmula y mi computadora se queda sin memoria si estoy tratando de hacerlo. ¡gracias!
cauldyclark
6

Encontré que el enfoque más fácil es usar la Distinct Countopción debajo Value Field Settings( haga clic izquierdo en el campo en el Valuespanel). La opción para Distinct Countestá al final de la lista.

Ubicación de donde hacer clic

Aquí están el antes (ARRIBA; normal Count) y después (ABAJO; Distinct Count)

CONTAR

CUENTA DISTINTA

Peter
fuente
3
A partir de Office 2016: para poder utilizar esta función, la tabla dinámica debe crearse con la opción "Agregar estos datos al modelo de datos" marcada.
Leo
3

No es necesario que la tabla se ordene para que la siguiente fórmula devuelva un 1 por cada valor único presente.

suponiendo que el rango de la tabla para los datos presentados en la pregunta es A1: B7 ingrese la siguiente fórmula en la celda C1:

=IF(COUNTIF($B$1:$B1,B1)>1,0,COUNTIF($B$1:$B1,B1))

Copie esa fórmula en todas las filas y la última fila contendrá:

=IF(COUNTIF($B$1:$B7,B7)>1,0,COUNTIF($B$1:$B7,B7))

Esto da como resultado un 1 devuelto la primera vez que se encuentra un registro y 0 para todos los tiempos posteriores.

Simplemente suma la columna en tu tabla dinámica

Jeff Baumet
fuente
2
En caso de que tenga un gran conjunto de datos, use =IF(COUNTIF($B$1:$B1,B1),1,0): de esta manera, ¡countif solo se ejecuta una vez!
Peter Albert
2

Mi enfoque de este problema fue un poco diferente de lo que veo aquí, así que lo compartiré.

  1. (Haga una copia de sus datos primero)
  2. Concatenar las columnas.
  3. Eliminar duplicados en la columna concatenada
  4. Último: pivote en el conjunto resultante

Nota: Me gustaría incluir imágenes para que esto sea aún más fácil de entender, pero no puedo porque esta es mi primera publicación;)

Jacob Noone Wade
fuente
1

La respuesta de Siddharth es excelente.

Sin embargo , esta técnica puede causar problemas al trabajar con un gran conjunto de datos (mi computadora se congeló en 50,000 filas). Algunos métodos menos intensivos en procesador:

Verificación de singularidad única

  1. Ordenar por las dos columnas (A, B en este ejemplo)
  2. Use una fórmula que busque menos datos

    =IF(SUMPRODUCT(($A2:$A3=A2)*($B2:$B3=B2))>1,0,1) 
    

Múltiples comprobaciones de unicidad

Si necesita verificar la unicidad en diferentes columnas, no puede confiar en dos tipos.

En lugar,

  1. Ordenar una sola columna (A)
  2. Agregue una fórmula que cubra el número máximo de registros para cada grupo. Si ABC puede tener 50 filas, la fórmula será

    =IF(SUMPRODUCT(($A2:$A49=A2)*($B2:$B49=B2))>1,0,1)
    
guía de trabajo
fuente
2
Otra forma posiblemente menos intensiva del procesador es agregar una columna C y en C2 =A2&B2. Luego agregue una columna D y en D2 ponga =IF(MATCH(C2, C$2:C2, 0) = ROW(C1), 1, 0). Rellene ambos hacia abajo. Si bien esto todavía se busca desde el comienzo de todo el rango, se detiene cuando encuentra el primero y, en lugar de multiplicar los valores de 50,000 filas, solo tiene que localizar el valor, por lo que debería funcionar mucho mejor.
ErikE
@ErikE Sharp: también creo que tu técnica se detiene en el primer hallazgo. Pero si tiene muchos valores únicos en C (ejemplo: solo 50 ABC), continuará verificando grandes cantidades de datos. Característica genial: su fórmula funciona mejor cuando los datos no están clasificados.
Workglide
1

Excel 2013 puede hacer un recuento distinto en pivotes. Si no hay acceso a 2013, y es una cantidad menor de datos, hago dos copias de los datos sin procesar, y en la copia b, selecciono ambas columnas y elimino los duplicados. Luego haga el pivote y cuente su columna b.

Zachary
fuente
1

Puede usar COUNTIFS para varios criterios,

= 1 / COUNTIFS (A: A, A2, B: B, B2) y luego arrastre hacia abajo. Puede poner tantos criterios como desee allí, pero su procesamiento suele llevar mucho tiempo.

user5100077
fuente
1

Paso 1. Agregar una columna

Paso 2. Use la fórmula = IF(COUNTIF(C2:$C$2410,C2)>1,0,1)en el 1er registro

Paso 3. Arrástrelo a todos los registros

Paso 4. Filtre '1' en la columna con fórmula

Abhishek Verma
fuente
0

Puede hacer una columna adicional para almacenar la unicidad, luego sumar eso en la tabla dinámica.

Lo que quiero decir es que la célula C1siempre debería serlo 1. La celda C2debe contener la fórmula =IF(COUNTIF($A$1:$A1,$A2)*COUNTIF($B$1:$B1,$B2)>0,0,1). Copie esta fórmula hacia abajo para que la celda C3contenga=IF(COUNTIF($A$1:$A2,$A3)*COUNTIF($B$1:$B2,$B3)>0,0,1) y así sucesivamente.

Si tiene una celda de encabezado, querrá moverlos todos hacia abajo una fila y su C3fórmula debería ser =IF(COUNTIF($A$2:$A2,$A3)*COUNTIF($B$2:$B2,$B3)>0,0,1).

lc.
fuente
0

Si tiene los datos ordenados ... sugiero usar la siguiente fórmula

=IF(OR(A2<>A3,B2<>B3),1,0)

Esto es más rápido ya que usa menos celdas para calcular.

SumitB
fuente
0

Normalmente ordeno los datos por el campo que necesito para hacer el recuento distinto y luego uso IF (A2 = A1,0,1); obtienes un 1 en la fila superior de cada grupo de ID. Simple y no toma ningún tiempo para calcular en grandes conjuntos de datos.

Orejeras generales
fuente
0

Puede usar para la columna auxiliar también VLOOKUP. Lo probé y parece un poco más rápido que COUNTIF.

Si está utilizando el encabezado y los datos comienzan en la celda A2, entonces, en cualquier celda de la fila, use esta fórmula y copie en todas las demás celdas de la misma columna:

=IFERROR(IF(VLOOKUP(A2;$A$1:A1;1;0)=A2;0;1);1)
Marossik
fuente
-3

Encontré una manera más fácil de hacer esto. Refiriéndome al ejemplo de Siddarth Rout, si quiero contar valores únicos en la columna A:

  • agregue una nueva columna C y complete C2 con la fórmula "= 1 / COUNTIF ($ A: $ A, A2)"
  • arrastre la fórmula hacia el resto de la columna
  • pivotee con la columna A como etiqueta de fila y Suma {columna C) en valores para obtener el número de valores únicos en la columna A
Mounir
fuente
Lógicamente, esto no puede funcionar para el OP porque no mira la columna B. ¿Cómo va a adaptar esto para trabajar con múltiples columnas?
ErikE