2016-08-11 2 views
4

저는 R을 오랫동안 사용 해왔다. 그래서 "안녕하세요, 저는 초심자입니다. 나에게 설명해주십시오"라고 말할 수는 없습니다. 하지만 지금은이 문제에 직면 해 있기 때문에 물어보고 싶은 것이 있습니다. 문제를 해결하지 않고 다른 문제를 해결할 때마다. 그러나 오늘 나는 충분히 호기심이 묻습니다.요소가 단일 열이 아닌 데이터 프레임

데이터 프레임을 동일한 길이의 열 집합으로 생각합니다. 나는 그것이 잘못되었음을 알고 있습니다. 데이터 프레임에 행렬, 다중 열 요소를 삽입 할 수 있기 때문에 잘못되었습니다. 실수로 그렇게하면 화면에 제대로 인쇄되지 않습니다.

  1. 겉으로는 일치하지 않는 열 R "머리"가있다라고하고 무엇을 정말 무슨 사이의 이름,

  2. 내가 데이터 프레임을 요청하는 확실한 방법을 찾을 수 없습니다 "당신이다이 있습니다 변수 데이터 프레임 당 일반 열 하나의 열 "또는"인생을 어렵게 만드는 그러한 좌절감을주는 내부 구조가 있습니까? "

이 작업을 수행하면 무슨 뜻인지 알 수 있습니다. 실행

example(predict.lm) 

예측 방법을 실행하고 pt라는 출력 행렬을 생성합니다.

그런 다음 NPK은 무엇인가, 그것은 NPK 그 후

npk$predict <- predict(npk.aov, type = "terms") 

라는 이름의 데이터 프레임에 추가, 대신에 매트릭스 출력으로 무료 서 복용, 자신의 예제의 마지막 단계를 변경? 여전히 데이터 프레임입니까?

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

흠 그래, 머리가 열 이름을보고 어떻게주의 :

> 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 

이 "predict.block"또는 "predict.P"라는 이름의 열이있는 것처럼 표시한다, 그러나이있다 하지 :

> colnames(npk) 
[1] "block" "N"  "P"  "K"  "yield" 
[6] "predict" 

기능은 "COLNAMES"더 적절 "column_or_whatever_else_we_find_here"라는 것입니다.

그리고 당신은 그 "열"내부는 구조를 알고 매트릭스 방식으로 요청해야 예측에 액세스하려면

> npk$predict.P 
NULL 

을 시도하고 아무것도 얻을 :

> 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"   

그러나, 때로는 우리가 우리가이 생각하는 함수에서 매트릭스를 얻을 수 있음을 이해하고, 출력이 병합입니다 예측하는 올바른 방법 실수로 "데이터 프레임 내부의 행렬"구조로 끝납니다.

나는 "당신도 이것을 알아 차리고 나에게 좌절시키는 방식으로 당신을 좌절시키는가요?"라고 물어보고 싶습니다. 그러나 그것이 건설적이지 않다는 것을 나는 안다. 여기에 더 건설적인 것들을 묻습니다.

데이터 프레임이 주어지면 그 안에있는 모든 "열"이 단일 열인 경우 알 수있는 가장 직접적인 경로는 무엇입니까? 나는 시도했습니다 같은 명백한 :

> 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 

그러므로 나는 각을 요청하는 함수를 작성할 수있는 데이터 프레임의 요소를 요청할 수 있습니다 알고 열 "당신은 매트릭스"당신은 "데이터 프레임"입니까, 당신은 "배열"입니까? 그러나 너무 지루해 보입니다.

+0

어떻게 당신에게 보통 열 이름 이외의 다른 기능을하는지 NPK의 $의 자동 완성을보고는 어떻습니까? RStudio에서는 아이콘을 훑어보기 만하면됩니다. – AlexR

+1

'str'은 친구입니다 (예 :'str (npk)'). – Gregor

+0

또한, "머리가 열 이름을보고합니다."*는 머리를 설명하기에 좋지 않은 것이라고 생각합니다. 'head'가하는 일은 처음 6 행을 반환 (그리고 인쇄)하는 것입니다. 'names()'또는'colnames()'는 열 이름을 반환하고''predict "'라는 단일 열이 있습니다. 단지 행렬 일뿐입니다. – Gregor

답변

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 <- cbind(npk, predict = predict(npk.aov, type = "terms")) 

npk에 열을 추가하는 것이 안전 할 것이다. 직접 과제는 더 위험합니다. class 사용

+0

몇 가지 예제에서 is.simple()을 테스트했지만 아직 실패하지 않았습니다. – pauljohn32

+0

글쎄, 내 거품을 버스트하려면'sapply (data.frame (x = as.Date ("2001-01-01")), is.simple)'과 함께 실패 할 것이다. 그러나'no.dims'는 괜찮을 것입니다. 날짜에는 요인과 같은 추가 속성이 있습니다. – MrFlick

+0

Ach. 나는 지금 당장 Date 문제를 발견하고 그것을 언급하기 위해 로그인했다. 너는 나를 때렸다. 더 많이 보았을 때, R은 데이터 프레임에 비 - 단일 - 열 (non-single-columns)을 삽입 할 수 있다는 것을 당황스럽게합니다. IMHO, 더 이상 데이터 프레임으로 정의해서는 안됩니다. – pauljohn32

0

I.

npk$predict <- predict(npk.aov, type = "terms") 
    sapply(npk,class) 
    #  block   N   P   K  yield predict 
    # "factor" "factor" "factor" "factor" "numeric" "matrix" 

II sapply() 내부. sapply()

sapply(npk,dim) 
    # $block 
    # NULL 

    # $N 
    # NULL 

    # $P 
    # NULL 

    # $K 
    # NULL 

    # $yield 
    # NULL 

    # $predict 
    # [1] 24 8 

III 내부 dim 사용. 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 내부 colnames 사용. attributes

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 

sapply() 내부 V. 정보 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 
관련 문제