如何按行分配数据框?这些是我尝试过的东西:
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
答案 0 :(得分: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
。
这是你期待的吗?
答案 1 :(得分:0)
[ ]
中的表达式后面加一个逗号
df[c('x1','x2'), ] <- <what you would like to assign>
答案 2 :(得分: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