我试图在R中的数据框中放入一些矩阵,例如:
m <- matrix(c(1,2,3,4), nrow=2, ncol=2)
df <- data.frame(id=1, mat=m)
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我得到一个包含2行3列的数据帧,而不是1行2列的数据帧.
阅读文档,我必须使用I()转义我的矩阵.
df <- data.frame(id=1, mat=I(m))
str(df)
'data.frame': 2 obs. of 2 variables:
$ id : num 1 1
$ mat: AsIs [1:2, 1:2] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
据我了解,数据帧包含矩阵每行的一行,mat字段是矩阵列值列表.
那么,我如何获得包含矩阵的数据帧?
谢谢 !
我发现包含矩阵的data.frames令人费解,但是:我知道实现这一目标的唯一方法是隐藏在 stats:::simulate.lm
试试这个,戳一下,看看发生了什么:
d <- data.frame(y=1:5,n=5)
g0 <- glm(cbind(y,n-y)~1,data=d,family=binomial)
debug(stats:::simulate.lm)
s <- simulate(g0,n=5)
Run Code Online (Sandbox Code Playgroud)
这是一种奇怪的后门解决方案.创建一个列表,将其类更改为data.frame,然后(这是必需的)设置names和row.names手动(如果你不做那些最后的步骤,数据仍将在对象中,但它将打印出来,好像它有零行...)
m1 <- matrix(1:10,ncol=2)
m2 <- matrix(5:14,ncol=2)
dd <- list(m1,m2)
class(dd) <- "data.frame"
names(dd) <- LETTERS[1:2]
row.names(dd) <- 1:5
dd
Run Code Online (Sandbox Code Playgroud)
一种更简单的方法是使用矩阵的占位符定义数据框
m <- matrix(c(1, 2, 3, 4), nrow = 2, ncol = 2)
df <- data.frame(id = 1, mat = rep(0, nrow(m)))
Run Code Online (Sandbox Code Playgroud)
然后分配矩阵。无需使用列表的类或使用*apply()函数。
df$mat <- m
Run Code Online (Sandbox Code Playgroud)
我在尝试理解pls包中的汽油数据时遇到了同样的问题。用于$工作。首先,我们创建一个矩阵,将其命名为spectrum_mat,然后创建一个命名为response_var1 的向量。
spectra_mat = matrix(1:45, 9, 5)
response_var1 = seq(1:9)
Run Code Online (Sandbox Code Playgroud)
现在我们将向量response_var1放入一个新的数据框中——我们称之为df。
df = data.frame(response_var1)
df$spectra = spectra_mat
Run Code Online (Sandbox Code Playgroud)
去检查,
str(df)
'data.frame': 9 obs. of 2 variables:
$ response_var1: int 1 2 3 4 5 6 7 8 9
$ spectra : int [1:9, 1:5] 1 2 3 4 5 6 7 8 9 10 ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10538 次 |
| 最近记录: |