R expand.grid()包含数据框

时间:2014-10-20 14:52:32

标签: r combinations

我有一个关于expand.grid()函数的问题,使用两个数据帧而不是两个向量。我想将两个数据框及其所有可能的组合组合在一起,同时简单地减去所有其他变量。例如......

df1 <- data.frame('USC', '2.3', '1.3', '5.4')
df2 <- data.frame('Texas', '1.2', '-1.4', '2.3')

所以基本上我可以使用expand.grid()函数得到第一个变量的所有组合,看起来像'USC Texas,Texas USC'等...但我想减去或找到其余的差异数据框中关联的变量。例如......

('USC Texas', '1.1', '2.7', '3.1')
('Texas USC', '-1.1', -2.7', '-3.1')

我可以以某种方式将expand.grid()函数与apply结合使用吗?任何帮助将不胜感激

2 个答案:

答案 0 :(得分:3)

这是一种方法:

mapply(function(x, y) if (!grepl("^[+-]?\\d+\\.\\d+$", x)) 
         c(paste(x, y), paste(y, x)) else 
           c(res <- as.numeric(as.character(x)) - as.numeric(as.character(y)), 
             -res), df1, df2)

#      X.USC.      X.2.3. X.1.3. X.5.4.
# [1,] "USC Texas" "1.1"  "2.7"  "3.1" 
# [2,] "Texas USC" "-1.1" "-2.7" "-3.1"

答案 1 :(得分:1)

这是另一种方式:

# clean up the data. Put df1 and df2 into one data.frame and convert the columns
# to their natural data type. Name the columns.
names(df2) <- names(df1)
d <- rbind(df1, df2)
names(d) <- letters[1:4]
d[] <- lapply(d, function(col) type.convert(as.character(col)))
#      a   b    c   d
#1   USC 2.3  1.3 5.4
#2 Texas 1.2 -1.4 2.3

# get the cartesian product of d with itself
x <- merge(d, d, by=character(0))
x <- subset(x, a.x != a.y)
x <- within(x, {
    a <- paste(a.x, a.y)
    b <- b.x - b.y
    c <- c.x - c.y
    d <- d.x - d.y
})
x[c('a', 'b', 'c', 'd')]
#           a    b    c    d
# 2 Texas USC -1.1 -2.7 -3.1
# 3 USC Texas  1.1  2.7  3.1