Какова частота появления любой ячейки столбца в любом другом столбце? - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть вопрос относительно сравнения столбцов в фрейме данных ... Скажем, у меня есть несколько данных, которые выглядят так:

Unique <- c("apple", "orange", "melon", "car", "mouse", "headphones", "light")
a1 <- c("apple", "tomato", "banana", "dog", "cat", "headphones", "future")
a2 <- c("apple", "orange", "pear", "monkey", "dog", "cat", "river")
a3 <- c("tomato", "pineapple", "cherry", "car", "space", "mars", "rocket")
df <- data.frame(Unique, a1, a2, a3)
df
> ## df
##        Unique         a1     a2        a3
## 1:      apple      apple  apple    tomato
## 2:     orange     tomato orange pineapple
## 3:      melon     banana   pear    cherry
## 4:        car        dog monkey       car
## 5:      mouse        cat    dog     space
## 6: headphones headphones    cat      mars
## 7:      light     future  river    rocket

Вопрос, на который я пытаюсь ответить: какова частота появления каждой ячейки столбца «Уникальный» во всем фрейме данных, кроме столбца «Уникальный»?

Я хотел бы получить вывод, который выглядит как-то как это:

 apple     2 
 orange    1 
  melon    0 
    car    1  
  mouse    0
headphones 0
  light    0

потому что во всем фрейме данных, кроме столбца «Уникальный», яблоко появляется 2 раза, оранжевый появляется 1 раз, дыня появляется 0 раз, и так далее ...

Как бы вы go получили это?

Кроме того, как бы мы отсортировали их по количеству частот, скажем от наивысшего к наименьшему?

Я пытался выяснить это уже пару дней, и я просто не могу взломать это ... любая помощь будет чрезвычайно признательна!

ps также, в R кажется, что каждая "ячейка" в кадре данных не относится к ячейке ..? я прав? На что они ссылаются, элементы?

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Вот решение, основанное на тидиверсе.

 Unique <- c("apple", "orange", "melon", "car", "mouse", "headphones", "light")
a1 <- c("apple", "tomato", "banana", "dog", "cat", "headphones", "future")
a2 <- c("apple", "orange", "pear", "monkey", "dog", "cat", "river")
a3 <- c("tomato", "pineapple", "cherry", "car", "space", "mars", "rocket")
df <- data.frame(Unique, a1, a2, a3,stringsAsFactors = FALSE)
df

library(tidyr)
library(dplyr)
df[,2:4] %>% pivot_longer(.,cols=c("a1","a2","a3")) %>% 
     group_by(value) %>% summarise(.,count = n()) %>% 
     right_join(.,df[1],by = c('value' = 'Unique')) %>% 
     mutate(count = ifelse(is.na(count),0,count))

... и на выходе.

# A tibble: 7 x 2
  value      count
  <chr>      <dbl>
1 apple          2
2 orange         1
3 melon          0
4 car            1
5 mouse          0
6 headphones     1
7 light          0
> 
1 голос
/ 08 апреля 2020

Мы можем unlist столбцы, отличные от «Уникального», преобразовать его в factor с levels, указанным как «Уникальный», и получить table в base R

table(factor(unlist(df[-1]), levels = df$Unique))
#      apple     orange      melon        car      mouse headphones      light 
#         2          1          0          1          0          1          0 

Или используя tidyverse

library(dplyr)
library(tidyr)
df %>% 
   pivot_longer(cols = -Unique) %>%
   mutate(value = factor(value, levels = unique(Unique))) %>% 
   filter(!is.na(value)) %>%
   count(value, .drop = FALSE)
# A tibble: 7 x 2
#  value          n
#* <fct>      <int>
#1 apple          2
#2 orange         1
#3 melon          0
#4 car            1
#5 mouse          0
#6 headphones     1
#7 light          0
0 голосов
/ 08 апреля 2020

с library(data.table)

Преобразуйте ваш data.frame в data.table

setDT(df)

Затем вы можете объединить data.table с id = "Unique". Это очень удобно, так как для каждого значения Unique у вас есть значение всех столбцов df в одном столбце

##  melt(df,id.vars = "Unique")
##         Unique variable      value
##  1:      apple       a1      apple
##  2:     orange       a1     tomato
##  3:      melon       a1     banana
##  4:        car       a1        dog
##  5:      mouse       a1        cat
##  6: headphones       a1 headphones
##  7:      light       a1     future
##  8:      apple       a2      apple
##  9:     orange       a2     orange
## 10:      melon       a2       pear
## 11:        car       a2     monkey
## 12:      mouse       a2        dog
## 13: headphones       a2        cat
## 14:      light       a2      river
## 15:      apple       a3     tomato
## 16:     orange       a3  pineapple
## 17:      melon       a3     cherry
## 18:        car       a3        car
## 19:      mouse       a3      space
## 20: headphones       a3       mars
## 21:      light       a3     rocket
##         Unique variable      value

Наконец, для каждого значения Unique нам просто нужно подсчитать, сколько значений в столбце Unique равны значению.

melt(df,id.vars = "Unique")[,sum(Unique==value),Unique]
##        Unique V1
## 1:      apple  2
## 2:     orange  1
## 3:      melon  0
## 4:        car  1
## 5:      mouse  0
## 6: headphones  1
## 7:      light  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...