如何创建具有嵌套列结构的data.frame

如何创建具有嵌套列结构的data.frame,r,dataframe,R,Dataframe,我希望创建一个包含两列的data.frame,每列包含多个列。(我需要它在pls包中提供plsr) 就像橄榄油数据一样 > oliveoil chemical.Acidity chemical.Peroxide chemical.K232 chemical.K270 chemical.DK sensory.yellow sensory.green G1 0.7300 12.7000 1.9000 0.1390

我希望创建一个包含两列的data.frame,每列包含多个列。(我需要它在pls包中提供plsr)

就像橄榄油数据一样

> oliveoil
   chemical.Acidity chemical.Peroxide chemical.K232 chemical.K270 chemical.DK sensory.yellow sensory.green
G1           0.7300           12.7000        1.9000        0.1390      0.0030           21.4          73.4
G2           0.1900           12.3000        1.6780        0.1160     -0.0040           23.4          66.3
G3           0.2600           10.3000        1.6290        0.1160     -0.0050           32.7          53.5
G4           0.6700           13.7000        1.7010        0.1680     -0.0020           30.2          58.3
G5           0.5200           11.2000        1.5390        0.1190     -0.0010           51.8          32.5
I1           0.2600           18.7000        2.1170        0.1420      0.0010           40.7          42.9
I2           0.2400           15.3000        1.8910        0.1160      0.0000           53.8          30.4
I3           0.3000           18.5000        1.9080        0.1250      0.0010           26.4          66.5
I4           0.3500           15.6000        1.8240        0.1040      0.0000           65.7          12.1
I5           0.1900           19.4000        2.2220        0.1580     -0.0030           45.0          31.9
S1           0.1500           10.5000        1.5220        0.1160     -0.0040           70.9          12.2
S2           0.1600            8.1400        1.5270        0.1063     -0.0020           73.5           9.7
S3           0.2700           12.5000        1.5550        0.0930     -0.0020           68.1          12.0
S4           0.1600           11.0000        1.5730        0.0940     -0.0030           67.6          13.9
S5           0.2400           10.8000        1.3310        0.0850     -0.0030           71.4          10.6
S6           0.3000           11.4000        1.4150        0.0930     -0.0040           71.4          10.0
   sensory.brown sensory.glossy sensory.transp sensory.syrup
G1          10.1           79.7           75.2          50.3
G2           9.8           77.8           68.7          51.7
G3           8.7           82.3           83.2          45.4
G4          12.2           81.1           77.1          47.8
G5           8.0           72.4           65.3          46.5
I1          20.1           67.7           63.5          52.2
I2          11.5           77.8           77.3          45.2
I3          14.2           78.7           74.6          51.8
I4          10.3           81.6           79.6          48.3
I5          28.4           75.7           72.9          52.8
S1          10.8           87.7           88.1          44.5
S2           8.3           89.9           89.7          42.3
S3          10.8           78.4           75.1          46.4
S4          11.9           84.6           83.8          48.5
S5          10.8           88.1           88.5          46.7
S6          11.4           89.5           88.5          47.2
它是一个data.frame,有两列:

> is.data.frame(oliveoil)
[1] TRUE

> dim(oliveoil)
[1] 16  2
我尝试了以下代码:

x = data.frame(a = c(1,2,3), b = c(1,3,4))
y = data.frame(c = c(3,4,5), d = c(5,4,2))

d = data.frame(x = x, y = y)
它返回:

> d
  x.a x.b y.c y.d
1   1   1   3   5
2   2   3   4   4
3   3   4   5   2
但我不能用d$x打电话给x

> d$x
NULL
我所期望的是:

> d$x
  a b
1 1 1
2 2 3
3 3 4
我希望data.frame函数中有一些参数可以使其工作,例如:

d = data.frame(x = x, y = y, merge.columns = F)
但是我在文档中找不到这样做的任何参数,
pls::plsr()
函数不需要像
oliveoil
那样设置数据
plsr()
允许响应项为矩阵,并且
oliveoil
具有存储矩阵的特殊方式,但是您可以向
plsr()
提供任何矩阵

例如,这适用于没有错误的模型:

y <- matrix(rnorm(n), nrow = 10)
x <- matrix(rnorm(n), nrow = 10)

plsr(y ~ x)
# Partial least squares regression , fitted with the kernel algorithm.
# Call:
# plsr(formula = y ~ x)
AsIs
类意味着它们是使用函数存储在
oliveoil
中的(我认为“I”代表“Identity”)
I()
保护对象在操作过程中不被转换为其他对象,如存储到数据帧中

您可以通过一个简单的示例再现这一点(不过请注意,如果您尝试使用
I()
在一个数据帧中存储两个数据帧,您将得到一个错误):

您也可以直接将
矩阵a
矩阵b
保存为矩阵:

# also works
df2 <- data.frame(a = matrix_a, b = matrix_b, foo = letters[1:10])
#同样有效

df2这是否回答了您的问题@不幸的是,卡米尔没有。我想要的是一个数据帧,而不是一个列表挂起,我的意思是-
data.frame(x=i(as.matrix(x)),y=i(as.matrix(y)))
?@thelatemail。是的,行得通。谢谢!。但是as.matrix将y中的值更改为字符串。当我将plsr转换为数字时,我将尝试plsr是否工作
n <- 100
matrix_a <- matrix(rnorm(n), nrow = 10)
matrix_b <- matrix(rnorm(n), nrow = 10)

df <- data.frame(a = I(matrix_a), b = I(matrix_b))

str(df)

'data.frame':   10 obs. of  2 variables:
 $ a: 'AsIs' num [1:10, 1:10] -0.817 -0.233 -1.987 0.523 -1.596 ...
 $ b: 'AsIs' num [1:10, 1:10] 1.9189 -0.7043 0.0624 0.0152 -0.5409 ...
df$a
            [,1]        [,2]       [,3]        [,4]        [,5]        [,6]
 [1,] -0.8167554 -0.61629222  0.3673423  1.30882012  0.97618868 -0.53124825
 [2,] -0.2329451  0.08556506 -0.5839086  0.86298000  1.20452166  0.09825958
 [3,] -1.9873738 -0.93537922  0.1057309  0.63585036 -1.09604531  1.33080572
 [4,]  0.5227912  1.89505993  1.1184905  1.20683770 -0.02431886 -1.15878634
# ...
# also works
df2 <- data.frame(a = matrix_a, b = matrix_b, foo = letters[1:10])