Есть хороший способ сделать операцию на всех парах столбцов двух фреймов данных? - PullRequest
1 голос
/ 21 июня 2011

Например, с учетом фреймов данных:

> df1
  a b
1 1 3
2 2 4

и

> df2
   x  y  z
1 10 12 14
2 11 13 15

и выполняя операцию сложения для каждой пары столбцов из df1 и df2, я хотел бы произвести:

> df3
  ax bx ay by az bz
1 11 13 13 15 15 17
2 13 15 15 17 17 19

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

df1 <- data.frame(a=1:2, b=3:4)
df2 <- data.frame(x=10:11, y=12:13, z=14:15)

byColumnAdditionAllPairs <- function(df1, df2) {

    doOp <- function(x, df1, df2, pairs) { 
        i <- pairs[x,1]; # ith column of df1
        j <- pairs[x,2]; # jth column of df2

        # add paired columns
        tmp <- df1[i] + df2[j];

        # set new column name
        names(tmp)[1] <- paste(names(df1)[i], names(df2)[j], sep="");

        # return column
        tmp
    }

    # generate column pairings
    pairs <- expand.grid(1:length(df1), 1:length(df2))

    # for each column pair, doOp
    data.frame(sapply(1:nrow(pairs), doOp, df1, df2, pairs))
}

df3 <- byColumnAdditionAllPairs(df1, df2)

Спасибо, Zach

Ответы [ 4 ]

5 голосов
/ 21 июня 2011

Вот один из способов. В нем есть элементы некоторых других ответов ...

z <- outer(colnames(df1), colnames(df2), function(c1,c2) df1[,c1] + df2[,c2])
colnames(z) <- outer(colnames(df1), colnames(df2), paste, sep = '')     

> z
  ax bx ay by az bz
1 11 13 13 15 15 17
2 13 15 15 17 17 19
3 голосов
/ 21 июня 2011
comb <- as.vector(outer(names(df1),names(df2),paste))
df3 <- data.frame(sapply(comb,function(x) df1[strsplit(x," ")[[1]][1]]+df2[strsplit(x," ")[[1]][2]]))  
names(df3) <- gsub(" ","",comb)

Что дает:

> df3
  ax bx ay by az bz
1 11 13 13 15 15 17
2 13 15 15 17 17 19
3 голосов
/ 21 июня 2011

Получить все имена пар столбцов, используя expand.grid.

col_pairs <- expand.grid(colnames(df1), colnames(df2))

Теперь примените функцию сложения

col_sums <- apply(col_pairs, 1L, function(x) df1[, x["Var1"]] + df2[, x["Var2"]])

Исправьте имена столбцов

col_names <- apply(col_pairs, 1L, function(x) paste(x, collapse = ""))
colnames(col_sums) <- col_names
2 голосов
/ 21 июня 2011

Несколько иной подход использует outer():

df1 <- data.frame(a = 1:2, b = 3:4)
df2 <- data.frame(x = 10:11, y = 12:13, z = 14:15)
m1 <- data.matrix(df1)
m2 <- data.matrix(df2)
t(sapply(1:2, function(x, m1, m2) outer(m1[x,], m2[x,], "+"), m1 = m1, m2 = m2))

, что дает:

> t(sapply(1:2, function(x, m1, m2) outer(m1[x,], m2[x,], "+"), m1 = m1, m2 = m2))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   11   13   13   15   15   17
[2,]   13   15   15   17   17   19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...