如何创建具有嵌套列结构的data.frame
我希望创建一个包含两列的data.frame,每列包含多个列。(我需要它在pls包中提供plsr) 就像橄榄油数据一样如何创建具有嵌套列结构的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
> 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])