Генерация комбинации фреймов данных без комбинации столбцов внутри фреймов данных (в r) - PullRequest
0 голосов
/ 01 ноября 2018

Я расширяю все комбинации строк между фреймами данных, но не расширяю между столбцами внутри фрейма данных. Вот пример того, как я сейчас реализую это enter code here:

df_1 <- data.frame(letters = letters[1:2], 
                   LETTERS = LETTERS[1:2],
                   greek = c("alpha", "beta"),
                   GREEK = c("ALPHA", "BETA"),
                   stringsAsFactors = F)
df_2 <- data.frame(numbers = c("one", "two"),
                   nums = 1:2,
                   imaginary = paste0(1:2, "i"),
                   stringsAsFactors = F)

result <- expand.grid(letters = df_1$letters, numbers = df_2$numbers,
                      stringsAsFactors = F)

for(n in 1:nrow(df_1)){
  matching_rows <- df_1[n,"letters"]==result$letters
  for(column in colnames(df_1)[-1]){
    result[matching_rows, column] <- df_1[n,column]
  }
}

for(n in 1:nrow(df_2)){
  matching_rows <- df_2[n,"numbers"]==result$numbers
  for(column in colnames(df_2)[-1]){
    result[matching_rows, column] <- df_2[n,column]
  }
}
> result
  letters numbers LETTERS greek GREEK nums imaginary
1       a     one       A alpha ALPHA    1        1i
2       b     one       B  beta  BETA    1        1i
3       a     two       A alpha ALPHA    2        2i
4       b     two       B  beta  BETA    2        2i

Этот результат верный, но петли for съедают мою производительность и кажутся нелепо нелегкими.

Мой идеальный результат был бы похож на expand.grid(df_1, df_2), но эта функция не принимает кадры данных в качестве входных данных.

Каков более эффективный (и, надеюсь, более элегантный) метод для достижения этого результата?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете использовать expand.grid() для индексов строк:

ind <- expand.grid(seq_len(nrow(df_1)), seq_len(nrow(df_2)))
cbind(df_1[ind$Var1, ], df_2[ind$Var2, ])
0 голосов
/ 01 ноября 2018

Попробуйте это

> merge(df_1, df_2)
  letters LETTERS greek GREEK numbers nums imaginary
1       a       A alpha ALPHA     one    1        1i
2       b       B  beta  BETA     one    1        1i
3       a       A alpha ALPHA     two    2        2i
4       b       B  beta  BETA     two    2        2i
...