如何用两个对象创建一个 R 数据框?
Posted
技术标签:
【中文标题】如何用两个对象创建一个 R 数据框?【英文标题】:How to create a R dataframe with two objects? 【发布时间】:2022-01-08 08:31:19 【问题描述】:假设我想在 R 中创建一个带有两个对象/变量的数据框,如下两个来自库 (projpred) 的示例。 第一个例子是:
projpred::df_gaussian
> str(df_gaussian)
'data.frame': 100 obs. of 2 variables:
$ x: num [1:100, 1:20] 0.274 2.245 -0.125 -0.544 -1.459 ...
$ y: num -1.275 1.843 0.459 0.564 1.873 ...
第二个例子是
projpred::df_binom
str(df_binom)
> str(df_binom)
'data.frame': 100 obs. of 2 variables:
$ x: num [1:100, 1:30] -0.619 1.094 -0.357 -2.469 0.567 ...
$ y: int 0 1 1 0 1 0 0 0 1 1 ...
很明显,这里的“x”是尺寸为 100 X 20 的矩阵,“y”是尺寸为 100 X 1 的向量/矩阵。当我执行以下操作时:
> x<- matrix(rnorm(49,0,1),ncol=7,nrow=7)
> x
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0.7475965 0.25087585 -0.5454202 1.1080362 0.772668671 0.1541041 -0.18822798
[2,] 0.1156593 0.01525141 -1.7016563 -1.4725411 -1.103412611 -0.5244481 -1.35857198
[3,] -2.0756020 0.76945330 2.1603842 -0.7884491 -0.058697197 1.7486573 -0.22084569
[4,] -0.7190079 0.02477635 -0.1113622 0.2430216 -0.002865642 0.8650818 0.01232973
[5,] -0.9197059 0.88796240 -0.7654234 -1.3388553 -1.323093057 -0.6983747 1.20201014
[6,] 1.4298535 0.04451137 1.2678596 0.3640843 -0.046717376 -2.2444299 1.80306550
[7,] -0.3876859 0.62635356 -0.3490285 -0.9496578 1.150150174 0.4247856 -0.97021264
> y<- rnorm(7,5,1)
> y
[1] 6.456016 4.984491 5.209759 7.183303 4.461657 5.005530 5.052837
> z<-data.frame(x,y)
我得到了类似下面的东西,这本质上不是我想要的。
> z
X1 X2 X3 X4 X5 X6 X7 y
1 0.7475965 0.25087585 -0.5454202 1.1080362 0.772668671 0.1541041 -0.18822798 6.456016
2 0.1156593 0.01525141 -1.7016563 -1.4725411 -1.103412611 -0.5244481 -1.35857198 4.984491
3 -2.0756020 0.76945330 2.1603842 -0.7884491 -0.058697197 1.7486573 -0.22084569 5.209759
4 -0.7190079 0.02477635 -0.1113622 0.2430216 -0.002865642 0.8650818 0.01232973 7.183303
5 -0.9197059 0.88796240 -0.7654234 -1.3388553 -1.323093057 -0.6983747 1.20201014 4.461657
6 1.4298535 0.04451137 1.2678596 0.3640843 -0.046717376 -2.2444299 1.80306550 5.005530
7 -0.3876859 0.62635356 -0.3490285 -0.9496578 1.150150174 0.4247856 -0.97021264 5.052837
> str(z)
'data.frame': 7 obs. of 8 variables:
$ X1: num 0.748 0.116 -2.076 -0.719 -0.92 ...
$ X2: num 0.2509 0.0153 0.7695 0.0248 0.888 ...
$ X3: num -0.545 -1.702 2.16 -0.111 -0.765 ...
$ X4: num 1.108 -1.473 -0.788 0.243 -1.339 ...
$ X5: num 0.77267 -1.10341 -0.0587 -0.00287 -1.32309 ...
$ X6: num 0.154 -0.524 1.749 0.865 -0.698 ...
$ X7: num -0.1882 -1.3586 -0.2208 0.0123 1.202 ...
$ y : num 6.46 4.98 5.21 7.18 4.46 ...
【问题讨论】:
【参考方案1】:用I
包裹asis
- 否则通过调用data.frame
,matrix
将转换为data.frame
。它记录在?I
在函数 data.frame 中。通过在对 data.frame 的调用中将对象包含在 I() 中来保护对象,可以抑制字符向量到因子的转换和名称的删除,并确保矩阵作为单列插入。我还可以用于保护要添加到数据框或通过 as.data.frame 转换为数据框的对象。
z <- data.frame(x = I(x), y)
> str(z)
'data.frame': 7 obs. of 2 variables:
$ x: 'AsIs' num [1:7, 1:7] -0.178 -1.37 -0.682 1.166 0.437 ...
$ y: num 5.12 4.58 5.41 4.91 6.43 ...
> is.matrix(z$x)
[1] TRUE
如果我们需要将 class
从 "AsIs"
更改
> class(z$x) <- c("matrix", "array")
> str(z)
'data.frame': 7 obs. of 2 variables:
$ x: 'matrix' num [1:7, 1:7] -0.178 -1.37 -0.682 1.166 0.437 ...
$ y: num 5.12 4.58 5.41 4.91 6.43 ...
或者另一个选项是tibble
library(tibble)
z1 <- tibble(x, y)
str(z1)
tibble [7 × 2] (S3: tbl_df/tbl/data.frame)
$ x: num [1:7, 1:7] -0.178 -1.37 -0.682 1.166 0.437 ...
$ y: num [1:7] 5.12 4.58 5.41 4.91 6.43 ...
【讨论】:
这非常简短而且非常有用。谢谢。以上是关于如何用两个对象创建一个 R 数据框?的主要内容,如果未能解决你的问题,请参考以下文章
【R】行或列数目不同的两个数据框如何用rbind/cbind合并?