下面的代码就像我想要的那样工作
d=c(0,1)
A1=c(0,1)
A2=c(0,1)
d=as.data.frame(d)
A1=as.data.frame(A1)
A2=as.data.frame(A2)
d=merge(d,A1)
d=merge(d,A2)
它产生低于d
> d
d A1 A2
1 0 0 0
2 1 0 0
3 0 1 0
4 1 1 0
5 0 0 1
6 1 0 1
7 0 1 1
8 1 1 1
我希望下面的代码行为与上面的代码完全相同
steps=3
ball_numbers=c(4,5,6)
d=as.data.frame(c(0,1))
for (i in (1:length(ball_numbers)-1))
{
assign(paste("A", i, sep = ""),c(0,1))
#how to convert variables on earlier step to dataframes?
d=merge(d,get(paste("A", i, sep = "")))
}
这个代码产生不同的d,当我期望d如上面第一组中所示
时 y c(0, 1)
1 0 0
2 0 1
3 1 0
4 1 1
在第二组代码的情况下,我如何确保得到相同的d?
答案 0 :(得分:2)
我建议避免弄乱assign
for various reasons,而只需创建一个使用expend.grid
的简单函数,例如:
combs <- function(nums, vec) {
res <- replicate(length(nums), vec, simplify = FALSE)
setNames(expand.grid(res), c("d", paste0("A", 1:(length(nums)-1))))
}
ball_numbers <- 4:6
d <- 0:1
combs(ball_numbers, d)
# d A1 A2
# 1 0 0 0
# 2 1 0 0
# 3 0 1 0
# 4 1 1 0
# 5 0 0 1
# 6 1 0 1
# 7 0 1 1
# 8 1 1 1
答案 1 :(得分:1)
这应该有用。
基本问题是每个向量都有相同的列名,因此合并没有正确发生。
steps=3
ball_numbers=c(4,5,6)
d=as.data.frame(c(0,1))
colnames(d) <- c("d")
for (i in (1:(length(ball_numbers)-1))){
assign(x = paste("A", i, sep = ""),value = c(0,1))
e <- as.data.frame(get(paste("A", i, sep = "")))
colnames(e) <- paste("A", i, sep="")
d <- merge(d,e)
}
您需要创建临时变量,以便重命名该列。