元素不是单列的数据框

时间:2016-08-11 17:42:59

标签: r dataframe

我已经使用R很长一段时间了,所以我不能说"嗨,我是新手,请向我解释这个问题"。但这就是我想问的问题,因为我偶尔遇到这个问题,而且每次我都不解决它并处理其他问题。但今天我很好奇地问。

我认为数据框是一个列的集合,每个列的长度相同。但是,我知道这是错误的。这是错误的,因为在数据框中可以插入矩阵,多列元素。当我不小心这样做时,我最终会得到一个不能在屏幕上显示的内容。有

  1. R" head"之间看似不一致的列名。说它有,它有什么,以及

  2. 我找不到一种明确的方式来询问数据框"你是一个常规的,每个可变数据帧一列,"或者"你是否有一些令人沮丧的内部结构让生活变得困难"

  3. 如果你这样做,你可以看到我的意思。运行

     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;。但似乎太乏味了。

2 个答案:

答案 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