Корреляции между выбранным столбцом и остальной частью data.frame в R - PullRequest
0 голосов
/ 25 февраля 2020

Мои данные составляют около 270 столбцов с 160.000 в основном нечисленными c наблюдениями .

Мне нужно найти шаблоны и зависимости между столбцами. Например, мне нужно соотношение столбца «Материал» с другими столбцами.

Material   |  Name    |  Country | Vehicle    
----------------------------------------------
Bricks     |  John    |  A       | Car
Bricks     |  John    |  A       | Car
Bricks     |  John    |  A       | Motorcycles
Bricks     |  John    |  B       | Motorcycles
Concrete   |  Bill    |  B       | Car
Concrete   |  Bill    |  B       | Car
Concrete   |  Bill    |  B       | Car
Concrete   |  Bill    |  A       | Car

Мой желаемый результат:

Name    - 100% 
Country - 75%
Vehicle - 50%

Я пытался:

library("GoodmanKruskal")
Cor_matrix<- GKtauDataframe(df)
plot(Cor_matrix)

но получил: Ошибка в таблице (x, y, useNA = includeNA): попытка создать таблицу с> = 2 ^ 31 элементами

или:

library("corrr")
df %>% correlate() %>% focus(Material)

Ошибка в статистике :: cor (x = x, y = y, use = use, method = method): 'x' должно быть числовым c

Итак, я Я ищу пакет и пример кода, который может обрабатывать нечисловые. Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020
  1. Если столбцы в вашем df имеют тип factor, вам необходимо сначала преобразовать их в число c.
df[] <- Map(as.numeric,df)

в противном случае

df[] <- Map(function(v) as.numeric(factor(v)),df)
Затем вы можете запустить следующий код
df %>% correlate() %>% focus(Material)

# A tibble: 3 x 2
  rowname Material
  <chr>      <dbl>
1 Name      -1    
2 Country    0.5  
3 Vehicle   -0.577

DATA

df <- structure(list(Material = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), .Label = c("Bricks", "Concrete"), class = "factor"), 
    Name = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Bill", 
    "John"), class = "factor"), Country = structure(c(1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 1L), .Label = c("A", "B"), class = "factor"), 
    Vehicle = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Car", 
    "Motorcycles"), class = "factor")), class = "data.frame", row.names = c(NA, 
-8L))
0 голосов
/ 25 февраля 2020

Ваш код использует функцию GKtauDataframe, которая пытается вычислить метрики для всех 270 х 270 комбинаций одновременно. Это слишком.

Однако, как вы упоминали, вы хотите сравнить один столбец с всеми другими . Это должно быть осуществимо, и не нужно так много памяти. Функция GKtau делает это между парой столбцов:

GKtau(df[, 1], df[, 2])

Чтобы получить значения для первого столбца относительно всех остальных, просто вызовите:

lapply(df[, -1], GKtau, df[, 1])

Конечно, вы можете уточните свой вывод, используя что-то вроде:

sapply(df[, -1], function(di) GKtau(df[, 1], di)$tauxy)

, что делает вывод более компактным.

...