R: функция combn и определение имен сгенерированных переменных

У меня есть фрейм данных с именем «dat» с 5 числовыми переменными (var1, var2, var3, var4, var5), каждая с 20 наблюдениями.

structure(list(var_1 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20), var_2 = c(7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26), var_3 = c(4, 
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 
22, 23), var_4 = c(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
15, 16, 17, 18, 19, 20, 21)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

Я использую этот код для создания и сохранения в новом фрейме данных (названном «объединенным») всех возможных пар комбинаций 5 переменных со средним значением 2 переменных, которые объединены вместе:

combined <- combn(dat, 2, FUN = rowMeans)

Вот результат:

structure(c(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
18, 19, 20, 21, 22, 23, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 
10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 
21.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 
12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 5.5, 6.5, 
7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 
18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 4.5, 5.5, 6.5, 7.5, 
8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 
19.5, 20.5, 21.5, 22.5, 23.5, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22), .Dim = c(20L, 6L))

1) Код работает нормально, но проблема в том, что новые сгенерированные переменные в «объединенном» фрейме данных называются V1, V2, V3, V4…. и я не могу понять каждую новую переменную, от которой происходит комбинация переменных. Я бы предпочел, чтобы новые сгенерированные переменные назывались «var1var2», «var1var3» и так далее… Есть ли способ получить это?

2) Кроме того, есть ли способ применить функцию combn только к некоторым столбцам, а не ко всем переменным, которые присутствуют в кадре данных «dat»?

3) Как я могу добавить новые сгенерированные переменные в исходный фрейм данных «dat», а не сохранять их в новом?

Спасибо большое за вашу помощь!


person Mariano C Giglio    schedule 19.11.2019    source источник
comment
Вам будет легче помочь, если вы включите простой воспроизводимый пример с образцом ввода и желаемым выходом, которые можно использовать для тестирования и проверки возможных решений.   -  person MrFlick    schedule 19.11.2019
comment
Я не знаю, подходит ли вам combn здесь: я предполагаю, что вы хотите сгруппировать по одним переменным и суммировать другие, верно?   -  person r2evans    schedule 19.11.2019
comment
@MrFlick, спасибо за ответ! Я обновил пост со структурой двух фреймов данных   -  person Mariano C Giglio    schedule 20.11.2019
comment
@ r2evans спасибо! Цифры в порядке! но в объединенном фрейме данных я хотел бы, чтобы каждая новая переменная (столбец) называлась var1var или var2var3, чтобы понять, из комбинации каких двух переменных происходит   -  person Mariano C Giglio    schedule 20.11.2019
comment
Что касается вашего вопроса 3, я думаю, что cbind(dat1, ...) должен работать, где ... - это результаты ваших усилий по combn-и-переименовать.   -  person r2evans    schedule 20.11.2019
comment
Спасибо @ r2evans!   -  person Mariano C Giglio    schedule 20.11.2019


Ответы (1)


Это можно сделать, повторив оператор combn с именами столбцов.

set.seed(99)
dat <- data.frame(var1 = sample(20),           #some sample data
                  var2 = sample(20),           #I did this before you added your data above!
                  var3 = sample(20),
                  var4 = sample(20),
                  var5 = sample(20))

dat
   var1 var2 var3 var4 var5
1    12    5   18   19   12
2     3    2   10    6   13
3    13   15   14   13    1
4    17   11   16   18   10
5     9   13    8    8    7
6    15    6   20   17    3  
...

combined <- combn(dat, 2, FUN = rowMeans)      #your statement using cols of dat

colnames(combined) <- combn(names(dat), 2, paste0, collapse="") #same using colnames

combined

      var1var2 var1var3 var1var4 var1var5 var2var3 var2var4 var2var5 var3var4 var3var5 var4var5
 [1,]      8.5     15.0     15.5     12.0     11.5     12.0      8.5     18.5     15.0     15.5
 [2,]      2.5      6.5      4.5      8.0      6.0      4.0      7.5      8.0     11.5      9.5
 [3,]     14.0     13.5     13.0      7.0     14.5     14.0      8.0     13.5      7.5      7.0
 [4,]     14.0     16.5     17.5     13.5     13.5     14.5     10.5     17.0     13.0     14.0
 [5,]     11.0      8.5      8.5      8.0     10.5     10.5     10.0      8.0      7.5      7.5
 [6,]     10.5     17.5     16.0      9.0     13.0     11.5      4.5     18.5     11.5     10.0
 ...

Чтобы ответить на другие ваши вопросы, вы можете ограничить используемые столбцы, используя, например, dat[,c(2,3,6)] в операторах comb (чтобы использовать столбцы 2, 3 и 6). Вы можете добавить их обратно в тот же фрейм данных с помощью dat <- cbind(dat, combined)

person Andrew Gustar    schedule 19.11.2019
comment
Большое спасибо, @Andrew Gustar! Ваш код работал очень хорошо! Большое спасибо! - person Mariano C Giglio; 20.11.2019