我有一个关于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结合使用吗?任何帮助将不胜感激
答案 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