2011-08-15 5 views
93

나는 같은 dataframe 있습니다 R data.frame 열을 벡터로 변환하는 친숙한 방법?

a1 = c(1, 2, 3, 4, 5) 
a2 = c(6, 7, 8, 9, 10) 
a3 = c(11, 12, 13, 14, 15) 
aframe = data.frame(a1, a2, a3) 

내가 시도 벡터에 열 중 하나를 변환하는 다음,하지만 작동하지 않습니다

avector <- as.vector(aframe['a2']) 
class(avector) 
[1] "data.frame" 

이 유일한 해결책 I입니다 가지고 올 수 있지만, 나는이 할 수있는 더 좋은 방법이있을 가지고 있으리라 믿고있어 :

class(aframe['a2']) 
[1] "data.frame" 
avector = c() 
for(atmp in aframe['a2']) { avector <- atmp } 
class(avector) 
[1] "numeric" 

참고 : 내 vocabular을 위의 y는 꺼져있을 수 있으므로 제발 수정하십시오. 나는 여전히 R의 세계를 배우고있다. 또한, 여기에 무슨 일이 일어나고 있는지에 대한 설명은 인정된다. (즉, 파이썬이나 다른 언어와 관련하여 도움이 될 것이다!)

+5

답변에서 볼 수 있듯이'? '[. data.frame''을 자세히 읽으면 매우 먼 곳으로 이동하게됩니다. – joran

+0

@ joran : 나는이 헬프 파일을 처음 접했을 때 처음이라고 생각합니다. 감사! data.table로 마이 그 레이션하기 전에. :) – Iterator

답변

137

나는 이것을 실수는 있지만, 나는 이것을 내기 할 것입니다.

데이터 프레임은 목록입니다. 열의 이름과 [을 사용하여 데이터 프레임의 하위 세트를 만들 때 하위 목록 (또는 하위 데이터 프레임)이 표시됩니다. 실제 원색 컬럼을 원하면 [[을 사용하거나 다소 혼란 스럽지만 (내가 할 수있는) aframe[,2]을 수행하면 하위 목록이 아닌 벡터를 반환합니다.

그래서이 순서를 실행 해보십시오 어쩌면 일이 명확하게됩니다

avector <- as.vector(aframe['a2']) 
class(avector) 

avector <- aframe[['a2']] 
class(avector) 

avector <- aframe[,2] 
class(avector) 
+6

+1 이것은 유용합니다. 나는 이것을 데이터 프레임과 행렬 모두에서 사용할 수 있기 때문에'aframe [, "a2"]'을 사용하는 데 익숙해 졌는데, 결과는 벡터와 같다. – Iterator

+6

'[..., drop = F]'는 항상 데이터 프레임을 반환합니다. – hadley

+1

'df $ x' 구문이 벡터를 반환하기 때문에 특히 유용합니다. 이 구문을 오랫동안 사용해 왔지만 열을 검색하기 위해'df [ 'name']'또는'df [n]'을 사용해야 할 때 벡터를 예상 한 함수로 보낼 때 문제가 발생했습니다. 'df [[n]]'또는'df [[ 'x']]'를 사용하면 모든 것을 정리할 수 있습니다. – rensa

15

당신은 as.vector() 필요하지 않습니다,하지만 당신은 올바른 색인이 필요합니까 : 것입니다 알고 있어야 avector <- aframe[ , "a2"]

한 다른 일을 drop=FALSE 옵션 [에 :

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15) 
R> aframe 
    a1 a2 a3 
1 1 6 11 
2 2 7 12 
3 3 8 13 
4 4 9 14 
5 5 10 15 
R> avector <- aframe[, "a2"] 
R> avector 
[1] 6 7 8 9 10 
R> avector <- aframe[, "a2", drop=FALSE] 
R> avector 
    a2 
1 6 
2 7 
3 8 
4 9 
5 10 
R> 
+4

+1 :'drop = FALSE'의 알림이 유용합니다. 이것은 N = 1 인 경우 data.frame에서 N 개의 열을 선택할 수있는 경우에 도움이됩니다. – Iterator

+0

내가 선택한 열의 수를 예측할 수 없을 때 이것을 사용합니다. 한 열이 나타나면 결과는 여전히 n 열이있는 data.frame으로 전달됩니다. 벡터가 원숭이 렌치를 함수 아래쪽에 던질 수 있습니다. –

23

당신은 $ extrac을 사용할 수 있습니다 기 :

class(aframe$a1) 
[1] "numeric" 

또는 이중 대괄호는 : 방금 추출 연산자를 사용하는 경우

class(aframe[["a1"]]) 
[1] "numeric" 
4

이 작동합니다. 기본적으로 []는 여기에 원하는 옵션 인 drop=TRUE을 설정합니다. 자세한 내용은 ?'['을 참조하십시오.

> a1 = c(1, 2, 3, 4, 5) 
> a2 = c(6, 7, 8, 9, 10) 
> a3 = c(11, 12, 13, 14, 15) 
> aframe = data.frame(a1, a2, a3) 
> aframe[,'a2'] 
[1] 6 7 8 9 10 
> class(aframe[,'a2']) 
[1] "numeric" 
5

'[['연산자를 사용하는 또 다른 장점은 data.frame과 data.table 모두에서 작동한다는 것입니다. 함수가 data.frame 및 data.table 모두 실행 만들 수있다, 당신은 벡터로에서 열을 추출 할 그렇다면 다음

data[["column_name"]] 

가장 좋습니다.

2
a1 = c(1, 2, 3, 4, 5) 
a2 = c(6, 7, 8, 9, 10) 
a3 = c(11, 12, 13, 14, 15) 
aframe = data.frame(a1, a2, a3) 
avector <- as.vector(aframe['a2']) 

avector<-unlist(avector) 
#this will return a vector of type "integer" 
2

dplyr을 사용하면 쉽게이를 수행 할 수 있습니다.

dplyr::pull(aframe, a2) 
관련 문제