0

如何按行分配给数据框?这些是我尝试过的事情:

df <- data.frame(id=1:5)
df[c('x1','x2')] <- c(1,2)
df[c('x1','x2')] <- matrix(c(1,2),nrow=1)
df[c('x1','x2')] <- matrix(c(1,2),nrow=1,byrow=T)

我想这样做的原因是我从每行的多元正态分布中生成一个点。

谢谢!

编辑:我希望输出看起来像:

id x1 x2
1  1  1  2
2  2  1  2
3  3  1  2
4  4  1  2
5  5  1  2

但我得到的是:

  id x1 x2
1  1  1  2
2  2  2  1
3  3  1  2
4  4  2  1
5  5  1  2
4

3 回答 3

1

您的函数返回一个向量c(1,2)。假设它在x.

df <- data.frame(id=1:5)
x <- 1:2 # function output.

df <- cbind(df, t(replicate(nrow(df), x)))
names(df) <- c("id", "x1", "x2")

> df

#   id x1 x2
# 1  1  1  2
# 2  2  1  2
# 3  3  1  2
# 4  4  1  2
# 5  5  1  2

如果您的函数返回了一堆 1*2 维度向量,那么您必须首先创建一个 5*2 的矩阵,然后再创建cbind.

这是你所期待的吗?

于 2013-02-21T21:07:46.373 回答
0

you are almost there! put a comma after your expression inside of the [ ]

 df[c('x1','x2'),  ]  <-  <what you would like to assign>
于 2013-02-21T20:39:20.853 回答
0

这就是 Arun 的答案有效的原因,以及另一种选择:

您应该避免将向量分配给数据框行,因为 R 数据框在每一列中可以有不同的变量类型。想象一下,您的列包含数字、字符串和因子;那么该数据框的一行不是向量(因为向量必须都是一种类型,即所有数字或所有因子),而是一个列表。如果您尝试在 R 期望列表的位置分配一个向量,则可能会发生不好的事情。

但是您可以将列表分配到数据框行中。例如:

> df <- data.frame(id=1:5, x1=1, x2=2)
> df
  id x1 x2
1  1  1  2
2  2  1  2
3  3  1  2
4  4  1  2
5  5  1  2
> row2 <- list(x1=3, x2=4)
> df[2, c('x1','x2')] <- row2
> df
  id x1 x2
1  1  1  2
2  2  3  4
3  3  1  2
4  4  1  2
5  5  1  2

或者,如果您知道(如您的示例中)一切都是数字的,只需构建一个矩阵而不是数据框。然后你可以将向量分配到矩阵行中,没问题。

> mat <- matrix(c(1:5, rep(1,5), rep(2,5)), 5, 3)
> colnames(mat) <- c("id","x1","x2")
> mat
     id x1 x2
[1,]  1  1  2
[2,]  2  1  2
[3,]  3  1  2
[4,]  4  1  2
[5,]  5  1  2
> row2 <- c(3,4)
> mat[2, c("x1","x2")] <- row2
> mat
     id x1 x2
[1,]  1  1  2
[2,]  2  3  4
[3,]  3  1  2
[4,]  4  1  2
[5,]  5  1  2
于 2013-03-29T19:26:01.253 回答