2017-02-13 6 views
0

Я хотел бы реализовать какой-то цикл для табуляции всех переменных из фреймворка данных с константой, причем константа является другой переменной.Создание нескольких таблиц из фрейма данных с использованием одной постоянной переменной по всем другим переменным

Например, у меня есть dataframe с тремя переменными, такими как фиктивные данные ниже, и я хочу создать приведенные таблицы.

df <- data.frame(V1 = factor(c("L", "L", "XL", "M", "S", "XXL")), 
       V2 = factor(c("Tall", "Medium", "Tall", "Small", "Small", "Very Tall")), 
       V3 = factor(c("Vegan", "Vegetarian", "Non-V", "Vegan", "Non-V", "Non-V"))) 

attach(df) 

table(V3, V3) 
table(V3, V2) 
table(V3, V1) 

Моя цель - создать каждую отдельную таблицу и скомпилировать ее в список. В списке я могу выполнять вычисления с использованием комбинаций анонимных функций и применять семейные звонки. Однако мне нужно найти способ создания этих таблиц по большому набору данных со многими переменными без утомительной работы по созданию каждого из них вручную.

Я попытался использовать lapply, sapply и for петли, но, похоже, не может получить метод, который работает на меня. Есть ли способ сделать это, который создает таблицы по всем переменным и помещает их в список?

+1

Я неправильно понял ваш вопрос, я думаю, но предоставил дополнительный ответ, используя 'lapply'. – lmo

+0

Этот метод работает красиво и был именно тем, что я искал. Я немного не понимаю, что происходит за столом? Я понимаю, что мы применяем функцию таблицы к подмножеству df без константы, которую я хочу сравнить. Что делает df [, 1]? – Seanosapien

+1

'df [, 1]' является вторым аргументом 'table', например' table (df [, 2], df [, 1]) '. – lmo

ответ

1

Чтобы сравнить одну переменную со всеми другими переменными в data.frame, а затем вернуть список, вы можете использовать lapply следующим образом.

lapply(df[-1], table, df[,1]) 
$V2 

      L M S XL XXL 
    Medium 1 0 0 0 0 
    Small  0 1 1 0 0 
    Tall  1 0 0 1 0 
    Very Tall 0 0 0 0 1 

$V3 

      L M S XL XXL 
    Non-V  0 0 1 1 1 
    Vegan  1 1 0 0 0 
    Vegetarian 1 0 0 0 0 

df[-1] говорит все переменные в ФР, кроме первого. Обратите внимание на запятую в df[,1], которая требуется для возврата вектора, а не одного списка элементов для использования в table.


Если вы хотите создать список таблиц, не одинаковых переменных пар (v1-v2, v1-v3, v2-v3), вы можете использовать combn. Аргумент simplify = FALSE возвращает список.

combn(df, 2, FUN=table, simplify=FALSE) 
[[1]] 
    V2 
V1 Medium Small Tall Very Tall 
    L  1  0 1   0 
    M  0  1 0   0 
    S  0  1 0   0 
    XL  0  0 1   0 
    XXL  0  0 0   1 

[[2]] 
    V3 
V1 Non-V Vegan Vegetarian 
    L  0  1   1 
    M  0  1   0 
    S  1  0   0 
    XL  1  0   0 
    XXL  1  0   0 

[[3]] 
      V3 
V2   Non-V Vegan Vegetarian 
    Medium  0  0   1 
    Small   1  1   0 
    Tall   1  1   0 
    Very Tall  1  0   0 

Если вы хотите получить таблицы каждой переменной само по себе, а затем

lapply(1:2, function(i) combn(df, i, FUN=table, simplify=FALSE)) 

будет производить вложенный список таблиц.

+0

Это хорошая функция, спасибо. Можно ли его прекратить после x количества таблиц? Например, если бы я хотел, чтобы он остановился, как только будут обработаны все комбинации V1 (в строке). Мне нужны таблицы, где V1 - это строка. Ура! – Seanosapien

+0

Для 'combn', проще всего вычислить все таблицы, а затем подмножить список. Вы можете сделать «combn (df, 2, FUN = table, simplify = FALSE) [1: 2]» для приведенного выше примера. – lmo

+0

Хорошо. Еще раз спасибо. – Seanosapien