如何用两个对象创建一个 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.framematrix 将转换为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 数据框?

【R】行或列数目不同的两个数据框如何用rbind/cbind合并?

如何从 R 中的 rasterbrick 对象创建长格式数据框

如何用angular中的另一个数组的子对象创建一个数组

如何用一些进程在动态参数内创建对象?

R语言数组数据框因子