我已经使用R很长一段时间了,所以我不能说"嗨,我是新手,请向我解释这个问题"。但这就是我想问的问题,因为我偶尔遇到这个问题,而且每次我都不解决它并处理其他问题。但今天我很好奇地问。
我认为数据框是一个列的集合,每个列的长度相同。但是,我知道这是错误的。这是错误的,因为在数据框中可以插入矩阵,多列元素。当我不小心这样做时,我最终会得到一个不能在屏幕上显示的内容。有
R" head"之间看似不一致的列名。说它有,它有什么,以及
我找不到一种明确的方式来询问数据框"你是一个常规的,每个可变数据帧一列,"或者"你是否有一些令人沮丧的内部结构让生活变得困难"
如果你这样做,你可以看到我的意思。运行
example(predict.lm)
运行预测方法,它会生成一个名为pt的输出矩阵。
然后更改其示例的最后一步,而不是将矩阵输出作为空闲站立,将其添加到名为npk的数据框
npk$predict <- predict(npk.aov, type = "terms")
之后,什么是npk?它仍然是一个数据框架吗?是
> is.data.frame(npk)
[1] TRUE
嗯,请注意head如何报告列名:
> head(npk)
block N P K yield predict.block predict.N predict.P
1 1 0 1 1 49.5 -0.8500000 -4.9250000 0.2083333
2 1 1 1 0 62.8 -0.8500000 4.9250000 0.2083333
3 1 0 0 0 46.8 -0.8500000 -4.9250000 -0.2083333
4 1 1 0 1 57.0 -0.8500000 4.9250000 -0.2083333
5 2 1 0 0 59.8 2.5750000 4.9250000 -0.2083333
6 2 1 1 1 58.5 2.5750000 4.9250000 0.2083333
predict.K predict.N:P predict.N:K predict.P:K
1 -0.9583333 0.9416667 1.1750000 0.4250000
2 0.9583333 -2.8250000 1.1750000 -0.1416667
3 0.9583333 0.9416667 1.1750000 -0.1416667
4 -0.9583333 0.9416667 -3.5250000 -0.1416667
5 0.9583333 0.9416667 1.1750000 -0.1416667
6 -0.9583333 -2.8250000 -3.5250000 0.4250000
predict.N:P:K
1 0.0000000
2 0.0000000
3 0.0000000
4 0.0000000
5 0.0000000
6 0.0000000
这使得它看起来好像有名为&#34; predict.block&#34;的列。或&#34; predict.P&#34;,但没有:
> colnames(npk)
[1] "block" "N" "P" "K" "yield"
[6] "predict"
功能&#34; colnames&#34;将更恰当地命名为&#34; column_or_whatever_else_we_find_here&#34;。
你没有得到任何尝试
> npk$predict.P
NULL
访问这些&#34;列&#34;在内部预测中,您必须知道结构并以矩阵方式询问:
> npk$predict[ , "P"]
1 2 3 4 5
0.2083333 0.2083333 -0.2083333 -0.2083333 -0.2083333
6 7 8 9 10
0.2083333 -0.2083333 0.2083333 0.2083333 0.2083333
11 12 13 14 15
-0.2083333 -0.2083333 -0.2083333 0.2083333 -0.2083333
16 17 18 19 20
0.2083333 0.2083333 -0.2083333 -0.2083333 0.2083333
21 22 23 24
-0.2083333 0.2083333 0.2083333 -0.2083333
我刚刚选择了这个例子来展示我和学生在向数据框添加非列内容时经常偶然发生的事情。
加入npk和预测输出的正确方法是合并,我也理解
> npk.new <- merge(npk, pt, by = "row.names",
suffixes = c("", ".predict"))
> colnames(npk.new)
[1] "Row.names" "block" "N"
[4] "P" "K" "yield"
[7] "block.predict" "N.predict" "P.predict"
[10] "K.predict" "N:P" "N:K"
[13] "P:K" "N:P:K"
然而,随着生命的发展,当我们认为存在单个列时,我们有时会从函数中得到一个矩阵,并且我们意外地在数据框内找到了#34;矩阵&#34;一种结构。
大多数情况下,我想问一下#34;你是否也注意到了这一点,是否会让你感到沮丧呢?&#34;但我知道这不具有建设性。这里有更具建设性的问题。
如果您获得了数据框,那么了解所有&#34;列&#34;的最直接途径是什么?在它是奇异的列。我尝试过这样明显的事情:
> sapply(npk, is.atomic)
block N P K yield predict
TRUE TRUE TRUE TRUE TRUE TRUE
> sapply(npk, is.vector)
block N P K yield predict
FALSE FALSE FALSE FALSE TRUE FALSE
到目前为止,我知道我可以在数据框中询问一个元素,如果它是一个矩阵
> sapply(npk, is.matrix)
block N P K yield predict
FALSE FALSE FALSE FALSE FALSE TRUE
因此我可以编写一个函数,询问每一列&#34;你是一个矩阵&#34;你是一个&#34;数据框&#34;,你是一个&#34;数组&#34;。但似乎太乏味了。
答案 0 :(得分:4)
你可以定义
is.simple <- function(x) {is.vector(x) | is.factor(x)}
sapply(npk, is.simple)
或者
no.dims <- function(x) {is.null(dim(x))}
sapply(npk, no.dims)
取决于您究竟在寻找什么。
使用
向npk
添加列会更安全
npk <- cbind(npk, predict = predict(npk.aov, type = "terms"))
如果您不确定所涉及的数据类型。直接指派更危险。
答案 1 :(得分:0)
予。在class
sapply()
npk$predict <- predict(npk.aov, type = "terms")
sapply(npk,class)
# block N P K yield predict
# "factor" "factor" "factor" "factor" "numeric" "matrix"
II。在dim
sapply()
sapply(npk,dim)
# $block
# NULL
# $N
# NULL
# $P
# NULL
# $K
# NULL
# $yield
# NULL
# $predict
# [1] 24 8
III。在colnames
sapply()
sapply(npk,colnames)
# $block
# NULL
# $N
# NULL
# $P
# NULL
# $K
# NULL
# $yield
# NULL
# $predict
# [1] "block" "N" "P" "K" "N:P" "N:K" "P:K" "N:P:K"
IV。在attributes
sapply()
sapply(npk,attributes)
# $block
# $block$levels
# [1] "1" "2" "3" "4" "5" "6"
# $block$class
# [1] "factor"
# $N
# $N$levels
# [1] "0" "1"
# $N$class
# [1] "factor"
# $P
# $P$levels
# [1] "0" "1"
# $P$class
# [1] "factor"
# $K
# $K$levels
# [1] "0" "1"
# $K$class
# [1] "factor"
# $yield
# NULL
# $predict
# $predict$dim
# [1] 24 8
# $predict$dimnames
# $predict$dimnames[[1]]
# [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15"
# [16] "16" "17" "18" "19" "20" "21" "22" "23" "24"
# $predict$dimnames[[2]]
# [1] "block" "N" "P" "K" "N:P" "N:K" "P:K" "N:P:K"
# $predict$constant
# [1] 54.875
诉关于npk
class(npk)
# [1] "data.frame"
mode(npk)
# [1] "list"
typeof(npk)
# [1] "list"
attributes(npk)
# $names
# [1] "block" "N" "P" "K" "yield" "predict"
# $row.names
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# $class
# [1] "data.frame"
str(npk)
# 'data.frame': 24 obs. of 6 variables:
# $ block : Factor w/ 6 levels "1","2","3","4",..: 1 1 1 1 2 2 2 2 3 3 ...
# $ N : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 1 1 2 ...
# $ P : Factor w/ 2 levels "0","1": 2 2 1 1 1 2 1 2 2 2 ...
# $ K : Factor w/ 2 levels "0","1": 2 1 1 2 1 2 2 1 1 2 ...
# $ yield : num 49.5 62.8 46.8 57 59.8 58.5 55.5 56 62.8 55.8 ...
# $ predict: num [1:24, 1:8] -0.85 -0.85 -0.85 -0.85 2.57 ...
# ..- attr(*, "dimnames")=List of 2
# .. ..$ : chr "1" "2" "3" "4" ...
# .. ..$ : chr "block" "N" "P" "K" ...
# ..- attr(*, "constant")= num 54.9
dim(npk)
# [1] 24 6
dimnames(npk)
# [[1]]
# [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15"
# [16] "16" "17" "18" "19" "20" "21" "22" "23" "24"
# [[2]]
# [1] "block" "N" "P" "K" "yield" "predict"
summary.default(npk)
# Length Class Mode
# block 24 factor numeric
# N 24 factor numeric
# P 24 factor numeric
# K 24 factor numeric
# yield 24 -none- numeric
# predict 192 -none- numeric
VI。额外信息:安装并加载psych
包
library(psych)
list(npk_1_5 = describe(npk[,-6]),npk_6 = describe(npk[,6]))
$npk_1_5
# vars n mean sd median trimmed mad min max range skew kurtosis se
# block* 1 24 3.50 1.74 3.50 3.50 2.22 1.0 6.0 5.0 0.00 -1.41 0.36
# N* 2 24 1.50 0.51 1.50 1.50 0.74 1.0 2.0 1.0 0.00 -2.08 0.10
# P* 3 24 1.50 0.51 1.50 1.50 0.74 1.0 2.0 1.0 0.00 -2.08 0.10
# K* 4 24 1.50 0.51 1.50 1.50 0.74 1.0 2.0 1.0 0.00 -2.08 0.10
# yield 5 24 54.88 6.17 55.65 54.75 6.15 44.2 69.5 25.3 0.24 -0.51 1.26
# $npk_6
# vars n mean sd median trimmed mad min max range skew kurtosis se
# block 1 24 0 3.86 0.31 -0.11 5.13 -4.75 5.90 10.65 0.10 -1.41 0.79
# N 2 24 0 5.03 0.00 0.00 7.30 -4.92 4.92 9.85 0.00 -2.08 1.03
# P 3 24 0 0.21 0.00 0.00 0.31 -0.21 0.21 0.42 0.00 -2.08 0.04
# K 4 24 0 0.98 0.00 0.00 1.42 -0.96 0.96 1.92 0.00 -2.08 0.20
# N:P 5 24 0 1.67 0.94 0.19 0.00 -2.82 0.94 3.77 -1.08 -0.86 0.34
# N:K 6 24 0 2.08 1.17 0.23 0.00 -3.52 1.17 4.70 -1.08 -0.86 0.42
# P:K 7 24 0 0.25 -0.14 -0.03 0.00 -0.14 0.43 0.57 1.08 -0.86 0.05
# N:P:K 8 24 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 NaN NaN 0.00