当vector的名称改变时,将vector转换为dataframe

时间:2015-08-18 20:18:13

标签: r vector dataframe

下面的代码就像我想要的那样工作

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?

2 个答案:

答案 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)
}

您需要创建临时变量,以便重命名该列。