R 是否有一种很好的方法可以对两个数据帧的列的所有对进行操作?

R 是否有一种很好的方法可以对两个数据帧的列的所有对进行操作?,r,R,例如,给定数据帧: > df1 a b 1 1 3 2 2 4 及 对来自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=

例如,给定数据帧:

> df1
  a b
1 1 3
2 2 4

对来自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)

df1使用
expand.grid
获取列对的所有名称

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

col\u pairs使用
expand.grid
获取列对的所有名称

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

col\u pairs稍微不同的方法是使用
outer()


稍微不同的方法是使用
outer()


这里有一条路。它包含了一些其他答案的元素

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

z这里有一个方法。它包含了一些其他答案的元素

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

z没有时间真正思考这个问题,但是
outer()
可能没有时间真正思考这个问题,但是
outer()
可能有用你可以做
outer(colnames(df1),colnames(df2),function(c1,c2)df1[,c1]+df2[,c2])
——获得除(dang)之外的一切柱names@Prasad这一点很好,但列名很容易获取,行名也很容易。
apply(expand.grid(names(df1),names(df2)),1,function(x)paste(x[1],x[2],sep=”“)
获取列名,可能有更简单的方法。我喜欢这种方法
df3您只需执行
outer(colnames(df1)、colnames(df2)、function(c1,c2)df1[,c1]+df2[,c2])
——即可获取除(dang)列之外的所有内容names@Prasad很好,但是列名很容易获取,行名也很容易。
apply(expand.grid(名称(df1),名称(df2)),1,函数(x)粘贴(x[1],x[2],sep=”“)
获取列名,可能有更简单的方法。我喜欢这种方法<代码>df3谢谢,肯定比我的方法更简洁,但不完全正确。谢谢,肯定比我的方法更简洁,但不完全正确。就是这样。更好的方法。谢谢,就是这个。更好的方法。谢谢。又短又甜,但是字符串操作感觉有点笨拙。又短又甜,但是字符串操作感觉有点笨拙。
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
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
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