2016-11-29 4 views
3

[ 함수에 의해 행렬이 추가 된 경우 data.frames은 행렬의 열 이름을 상속하는 것으로 보입니다. 예 :data.frame에서 새 열을 가져 오는 경우 어떻게됩니까?

blob <- matrix(11:20, ncol = 1, dimnames = list(NULL, "BLOB")) 
foo <- data.frame(FOO = 201:210) 

dat <- data.frame(id = 1:10) 

dat[, "new1"] <- blob 
dat[, "new2"] <- foo 

지금 dat에 보면, 그것은 나에게

id BLOB new2 
1 11 201 
2 12 202 
3 13 203 
... 
그래서

예상 "new1"가 표시됩니다 아니지만, "BLOB"을 보여줍니다; colnames(dat)"id", "new1""new2" 인 경우에도 마찬가지입니다. 또한 "BLOB"attributes(dat)에없고, dat[, "BLOB"]에는 "정의되지 않은 열을 선택했습니다."라는 오류가 있습니다. 두 질문 :

  1. 이유 dat 공연이 경우 "BLOB"하지 "new1"합니까?
  2. dat"BLOB" 대신 "new1"으로 표시하려면 어떻게해야합니까?

답변

2

전체 행렬을 data.frame의 열에 할당하면 매우 이상한 개체가 생성됩니다. 당신이 dat의 구조를 보면 당신은

'data.frame': 10 obs. of 3 variables: 
$ id : int 1 2 3 4 5 6 7 8 9 10 
$ new1: int [1:10, 1] 11 12 13 14 15 16 17 18 19 20 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : NULL 
    .. ..$ : chr "BLOB" 
$ new2: int 201 202 203 204 205 206 207 208 209 210 

그래서 당신은 여전히 ​​행렬의 열을 추가 한 볼 수 있습니다. 그리고 포함 된 행렬에 열 이름 "BLOB"이 유지 된 것을 볼 수 있습니다. 그냥

dat[, "new1"] <- blob[,1] 

으로이 blob 하나 이상의 열을 가질 수있는 일이 그 이유를 data.frame의 칼럼 매트릭스의 열을 할당하는 것이 안전 할 것이다. "new1"에만 할당하면 다른 열은 어디로 가야합니까? 따라서 전체 행렬을 열에 포함합니다.

당신은 "BLOB"열 이름을 유지하는 것

do.call("cbind.data.frame", dat) 

와 임베디드 매트릭스를 확장 할 수 있지만 지금은 그렇게 "BLOB"이 colnames()

에 나열 될 것 "정상적인"data.frame 것

R이 포함 된 행렬로 data.frame을 인쇄 할 때 일반적으로 행렬 이름 앞에 data.frame 열 이름 앞에 접두어가 붙습니다. 단 하나의 열만있는 경우 행렬 열 이름 만 사용합니다 (이는 혼란 스러울 수 있음)). 관찰 :

mm<-matrix(1:9+10, nrow=3, dimnames=list(NULL, c("m1","m2","m3"))) 
data.frame(a=1:3, b = mm, c=letters[1:3]) 
# a b.m1 b.m2 b.m3 c 
# 1 1 11 14 17 a 
# 2 2 12 15 18 b 
# 3 3 13 16 19 c 
data.frame(a=1:3, b = mm[,1, drop=FALSE], c=letters[1:3]) 
# a m1 c 
# 1 1 11 a 
# 2 2 12 b 
# 3 3 13 c 

짧은 이야기 : data.frame에 매트릭스를 넣지 마십시오.

+2

아마도 'foo'와 같은'data.frame'을 전체 열에 할당하는 것은 위험 할 것입니다. '<- foo [[1]]'또는'<- foo [, 1]'은 방어 적입니다. – Gregor

+0

@ MrFlick, 지금까지 답변 해 주셔서 감사합니다. 임베디드 행렬이 무엇인지 (목적을 포함하여) 어떻게 다루는 지 설명 할 수 있습니까? – Qaswed