Combine every element with every other element of an object (cross-product)

社会主义新天地 提交于 2020-01-30 05:19:14

问题


I have two vectors of integers, say v1=c(1,2) and v2=c(3,4), I want to combine and obtain this as a result (as a data.frame, or matrix):

> combine(v1,v2) <--- doesn't exist
1 3
1 4
2 3
2 4

This is a basic case. What about a little bit more complicated - combine every row with every other row? E.g. imagine that we have two data.frames or matrices d1, and d2, and we want to combine them to obtain the following result:

d1
1 13
2 11

d2
3 12
4 10

> combine(d1,d2) <--- doesn't exist
1 13 3 12
1 13 4 10
2 11 3 12
2 11 4 10

How could I achieve this?


回答1:


For the simple case of vectors there is expand.grid

v1 <- 1:2
v2 <- 3:4
expand.grid(v1, v2)
#  Var1 Var2
#1    1    3
#2    2    3
#3    1    4
#4    2    4

I don't know of a function that will automatically do what you want to do for dataframes(See edit)

We could relatively easily accomplish this using expand.grid and cbind.

df1 <- data.frame(a = 1:2, b=3:4)
df2 <- data.frame(cat = 5:6, dog = c("a","b"))

expand.grid(df1, df2) # doesn't work so let's try something else
id <- expand.grid(seq(nrow(df1)), seq(nrow(df2)))
out <-cbind(df1[id[,1],], df2[id[,2],])
out
#    a b cat dog
#1   1 3   5   a
#2   2 4   5   a
#1.1 1 3   6   b
#2.1 2 4   6   b

Edit: As Joran points out in the comments merge does this for us for data frames.

df1 <- data.frame(a = 1:2, b=3:4)
df2 <- data.frame(cat = 5:6, dog = c("a","b"))
merge(df1, df2)
#  a b cat dog
#1 1 3   5   a
#2 2 4   5   a
#3 1 3   6   b
#4 2 4   6   b


来源:https://stackoverflow.com/questions/10864433/combine-every-element-with-every-other-element-of-an-object-cross-product

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!