data.frame 열을 벡터로 변환 하시겠습니까?


163

다음과 같은 데이터 프레임이 있습니다.

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"

이것이 내가 취할 수있는 유일한 해결책이지만, 이것을 수행하는 더 좋은 방법이 있어야한다고 가정합니다.

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

참고 : 위의 어휘가 꺼져있을 수 있으므로 수정하십시오. 나는 여전히 R의 세계를 배우고 있습니다. 또한, 여기서 무슨 일이 일어나고 있는지에 대한 설명은 높이 평가됩니다 (즉, 파이썬이나 다른 언어와 관련이 있으면 도움이 될 것입니다!)


5
답변에서 보듯이, 자세히 읽으면 ?'[.data.frame'매우 멀리 갈 것입니다.
joran

답변:


208

나는 실수를하지 않고 이것을 설명하려고 노력할 것이지만, 나는 이것이 의견에서 명확하게 하나 또는 두 개를 끌 것이라고 내기 할 것입니다.

데이터 프레임은 목록입니다. 열의 이름을 사용하여 데이터 프레임을 서브 세트 할 때 및을 [얻는 것은 서브 리스트 (또는 서브 데이터 프레임)입니다. 실제 원자 열을 원한다면 하위 목록이 아닌 벡터를 반환하는 [[을 사용할 수 aframe[,2]있습니다.

따라서이 시퀀스를 실행하면 상황이 더 명확해질 수 있습니다.

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

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

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

6
+1 유용합니다. 나는 aframe[,"a2"]데이터 프레임과 행렬 모두에서 이것을 사용할 수있는 능력 때문에 사용하는 데 익숙해졌으며 같은 결과를 얻는 것 같습니다-벡터.
반복자

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

1
df$x구문은 벡터를 반환 하기 때문에이 점을 알고 있으면 특히 좋습니다 . 이 구문을 오랫동안 사용했지만 열을 사용 df['name']하거나 df[n]열을 검색해야 할 때 예상되는 벡터로 함수에 보내려고 할 때 문제가 발생했습니다. 바로 사용 df[[n]]하거나 df[['x']]지 웁니다.
rensa

8
as.vector조용히 효과가없는 것 같습니까? 이것이 벡터를 반환하거나 눈에 띄게 실패해서는 안됩니까?
bli

aframe[['a2']]형상 열이 포함되어 있기 때문에 두 개의 열을 반환 sf하기 때문에 객체에 매우 유용합니다 aframe[,"a2"].
Matt


32

$추출을 사용할 수 있습니다 .

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

또는 이중 대괄호 :

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

21

필요하지는 않지만 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은 유용합니다. 이는 data.frame에서 N 개의 열을 선택할 수있는 경우, N = 1 인 경우에 도움이됩니다.
Iterator

선택한 열 수를 예측할 수 없을 때 이것을 사용하고 하나의 열이 나타나면 결과가 여전히 n 개의 열이있는 data.frame으로 전달됩니다. 벡터는 멍키 렌치를 줄 아래로 함수에 던질 수 있습니다.
Roman Luštrik

11

'[['연산자를 사용하는 또 다른 장점은 data.frame 및 data.table과 함께 작동한다는 것입니다. 따라서 data.frame과 data.table 모두에 대해 함수를 실행해야하고 열을 벡터로 추출하려는 경우

data[["column_name"]] 

최고 다.



5

추출 연산자를 사용하면 작동합니다. 기본적으로 []는 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"


3
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

목록을 사용하여 목록에 % in % 값이 있는지 여부에 따라 데이터 프레임을 필터링합니다.

R에 붙여 넣기 전에 각 요소 주위에 ""를 추가하는 Excel로 1 열 데이터 프레임을 내 보내서 수동으로 목록을 만들었습니다. list <-c ( "el1", "el2", ...) 보통 뒤에 FilteredData <-서브 세트 (데이터, 열 % in % 목록).

stackoverflow를 검색하고 1 열 데이터 프레임을 목록으로 변환하는 직관적 인 방법을 찾지 못하면 이제 첫 번째 stackoverflow 기여를 게시하고 있습니다.

# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
  list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")

1

data.frame 열을 일반적으로 간단한 벡터로 변환 할 수도 있습니다. as.vectordata.frame 클래스와 구조를 유지하는 것만으로는 충분하지 않으므로 첫 번째 (및 유일한) 요소를 가져와야합니다.

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

지금까지 제안 된 모든 솔루션에는 하드 코딩 열 제목이 필요합니다. 이것은 그것들을 제네릭이 아닌 것으로 만듭니다 (함수 인수에 이것을 적용한다고 상상해보십시오).

또는 열에서 열 이름을 먼저 읽은 다음 다른 솔루션의 코드에 삽입 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.