r: combinar filtro con n_distinct en el marco de datos

Una pregunta simple. Considerando el marco de datos a continuación, quiero contar identificaciones distintas: una para todos los registros y otra después de filtrar el estado. Sin embargo, el %>% no parece funcionar aquí. Sólo quiero tener un solo valor como ouput (así que total esto debe ser 10, para closed debe ser 5), no un marco de datos . Ambas líneas no funcionan

dat <- data.frame (ID = as.factor(c(1:10)),
                   status = as.factor(rep(c("open","closed"))))


total <- n_distinct(dat$ID)
#closed <- dat %>% filter(status == "closed") %>% n_distinct(dat$ID)
#closed <- dat %>% filter(status == "closed") %>% n_distinct(ID)

Pregunta hecha hace 3 años, 4 meses, 29 días - Por progprophet


4 Respuestas:

  • n_distinct espera un vector como entrada, usted está pasando un marco de datos. Puedes hacerlo:

    library(dplyr)
    
    dat %>% 
      filter(status == "closed") %>%
      summarise(n = n_distinct(ID))
    
    #  n
    #1 5
    

    O sin usar filter :

    dat %>% summarise(n = n_distinct(ID[status == "closed"]))
    

    Puedes añadir %>% pull(n) a arriba si desea un vector de vuelta y no un marco de datos.

    Respondida el Dec 17, 2020 a las 07:55 - por scriptwarrior

    Votos positivos: 0 | Votos negativos: 0

  • Una opción con data.table

    library(data.table)
    setDT(dat)[status == "closed"][, .(n = uniqueN(ID))]
    

    Respondida el Dec 17, 2020 a las 08:05 - por syntaxsavvy

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código radica en cómo estás utilizando la función n_distinct() después de filtrar el marco de datos. Para obtener el recuento de identificaciones distintas después de filtrar por el estado "closed", puedes hacer lo siguiente:

    R
    library(dplyr)
    
    dat <- data.frame(ID = as.factor(c(1:10)),
                      status = as.factor(rep(c("open", "closed"))))
    
    total <- n_distinct(dat$ID)
    closed <- dat %>% filter(status == "closed") %>% summarise(num_distinct = n_distinct(ID))
    
    print(total)  

    Output: 10

    print(closed$num_distinct)

    Output: 5

    En este código, utilizamos la función summarise() después de filtrar el marco de datos por el estado "closed" para calcular el recuento de identificaciones distintas. Luego, para acceder al valor obtenido, especificamos el nombre de la columna en la que se almacenó el resultado (num_distinct).

    Respondida el Dec 18, 2020 a las 08:00 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para contar valores distintos en un marco de datos, puedes utilizar la función n_distinct(). Para filtrar el marco de datos antes de contar los valores distintos, puedes utilizar la función filter().

    Para obtener un único valor como salida, puedes utilizar la función summarise(). Aquí tienes un ejemplo de cómo puedes hacerlo:

    
    library(dplyr)
    
    dat <- data.frame (ID = as.factor(c(1:10)),
                       status = as.factor(rep(c("open","closed"))))
    
    total <- summarise(dat, n_distinct(ID))
    closed <- summarise(dat %>% filter(status == "closed"), n_distinct(ID))
    
    print(total)
    print(closed)
    

    Esto imprimirá los siguientes resultados:

    `` <h1>A tibble: 1 x 1</h1>n_distinct(ID)` 1 10

    A tibble: 1 x 1

    n_distinct(ID) 1 5 ```

    Como puedes ver, total contiene el número total de valores distintos en el marco de datos, y closed contiene el número de valores distintos en el subconjunto de datos filtrados por el estado "cerrado".

    Respondida el Dec 18, 2020 a las 08:08 - por Gemini

    Votos positivos: 0 | Votos negativos: 0