给出两个数据框:
df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))
df1
# CustomerId Product
# 1 Toaster
# 2 Toaster
# 3 Toaster
# 4 Radio
# 5 Radio
# 6 Radio
df2
# CustomerId State
# 2 Alabama
# 4 Alabama
# 6 Ohio
Run Code Online (Sandbox Code Playgroud)
我怎样才能做数据库风格,即sql风格,加入?也就是说,我该怎么做:
我有三个或更多的自变量表示为R向量,如下所示:
A <- c(1,2,3)
B <- factor(c('x','y'))
C <- c(0.1,0.5)
Run Code Online (Sandbox Code Playgroud)
我想采用所有这些产品的笛卡尔积,并将结果放入数据框中,如下所示:
A B C
1 x 0.1
1 x 0.5
1 y 0.1
1 y 0.5
2 x 0.1
2 x 0.5
2 y 0.1
2 y 0.5
3 x 0.1
3 x 0.5
3 y 0.1
3 y 0.5
Run Code Online (Sandbox Code Playgroud)
我可以通过手动写出调用来执行此操作rep:
d <- data.frame(A = rep(A, times=length(B)*length(C)),
B = rep(B, times=length(A), each=length(C)),
C = rep(C, each=length(A)*length(B))
Run Code Online (Sandbox Code Playgroud)
但是必须有更优雅的方式去做,是吗? product在itertools部分工作中,但我找不到任何方法来吸收迭代器的输出并将其放入数据框中.有什么建议?
ps此计算的下一步看起来像
d$D <- f(d$A, d$B, d$C)
Run Code Online (Sandbox Code Playgroud)
所以如果你知道一次做两个步骤的方法,这也会有所帮助.
我有一个data.frame df,我希望这里的每一行df都是重复的lengthTime次数,并且添加了一个新的列,从1开始lengthTime计算每行df.
我知道,这听起来很复杂,但我基本上要为申请expand.grid到df.这是一个丑陋的解决方法,我觉得有一个更简单的解决方案(甚至可能是一个base-R函数?):
df <- data.frame(ID = rep(letters[1:3], each=3),
CatA = rep(1:3, times = 3),
CatB = letters[1:9])
lengthTime <- 3
nrRow <- nrow(df)
intDF <- df
for (i in 1:(lengthTime - 1)) {
df <- rbind(df, intDF)
}
df$Time <- rep(1:lengthTime, each=nrRow)
Run Code Online (Sandbox Code Playgroud)
我以为我可以使用expand.grid(df, 1:lengthTime),但这不起作用.outer也没带任何运气.那么有谁知道一个好的解决方案?