데이터 프레임의 행을 벡터로 변환


116

데이터 프레임의 행에서 벡터를 만들고 싶습니다. 그러나 행과 열 이름이 필요하지 않습니다. 여러 가지를 시도했지만 운이 없었습니다.

이것은 내 데이터 프레임입니다.

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

나는 시도했다 :

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

그러나 나는 정말로 다음과 같은 것을 원합니다.

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6

올바르게 표시 한 데이터의 형식을 지정하는 것이 좋습니다. 줄 바꿈이 누락 된 것 같습니다.
— Chinmay Patil 2013 년

나는 행을 원한다. 'a'열이 아닌 '1'행.
— Joko

이것을 데이터 프레임의 모든 행에 적용하여 모든 벡터를 단일 벡터로 병합하는 방법이 있습니까?
— stephanmg aug

1
@stephanmg : 어떻 c(t(as.matrix(df)))습니까?
— Andri Signorell

Andri : 저도 다르게 해결할 수는 있지만 작동합니다.
— stephanmg

답변:


154

데이터 프레임에서 단일 행을 추출하면 한 행 데이터 프레임이 생성됩니다. 숫자 형 벡터로 변환 :

as.numeric(df[1,])

@Roland가 제안했듯이은 unlist(df[1,])이름을 삭제하지 않고 한 행 데이터 프레임을 숫자 형 벡터로 변환합니다. 따라서 unname(unlist(df[1,]))동일한 결과를 얻는 또 다른 방법입니다.

아래 @Josh가 언급했듯이 완전 숫자 (알파벳, 인수, 혼합 ...) 데이터 프레임이있는 경우 as.character(df[1,])대신 필요 합니다.


그것은 그들이 질문의 텍스트와 제목이 왜곡 된 경우에도 원하는 것을 명확하게 도시 된 코드를 제공하기위한 영업 이익 (다운 투표 0) 일이 될 수 있습니다 ...
— 벤 Bolker

@ChinmayPatil, 다른 옵션은 무엇입니까? 그들의 코드 예제는 확실히 그들이 원하는 것처럼 보입니다.
— Ben Bolker 2013-01-23

2
데이터 프레임은 이미 벡터이므로 as.vector는 이것이 모드 "목록"의 벡터라고보고 아무 작업도하지 않는다는 점에 유의해야합니다. 기본 메커니즘에 대한 이해를 돕기 위해 좀 더 예시적인 as.vector (df [1,], mode = "numeric")를 사용해보십시오. 이것이 as.numeric이하는 일입니다.

1
문제 없어요. 나는 이 문제 에 대해 정확히 동일한 대답을 제공 한다고 말하고 있습니다.
— Ben Bolker

1
: 그 동안 변경,하지만 오늘 올라가지는 이름을 삭제 할 수 있습니다되었을 수 있습니다 identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (;-) ... data.frame에 대한 분별있는 이름이 아닌 BTW DF 여전히 등)
— Andri Signorell

45

unlist이름을 유지하는을 권장 합니다.

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

명명 된 벡터를 원하지 않는 경우 :

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6

7

숫자로 변경하지 않으려면 이것을 시도 할 수 있습니다.

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6

3
이것은 나에게 많은 이해가되지 않습니다 str(as.vector(t(df)[,1]))이다 num [1:3] 1 2 2.6, 즉 코드 않는 숫자 벡터에 결과를 변환 ...
— 벤 Bolker

2
특히 t(df)R 을 사용할 때 데이터 프레임을 행렬로 강제 변환합니다.이 경우 모든 요소가 숫자이기 때문에 숫자 행렬이됩니다. 그런 다음 [,1]첫 번째 열 (중복 차원이 자동으로 삭제되므로 숫자 형 벡터)을 추출합니다. as.vector()이름을 삭제하기 만하면됩니다 (으로도 수행 할 수 있음 unname()).
— Ben Bolker 2013 년

캐릭터에게도 효과가있는 것 같습니다. 그러나 당신은 강압에 대해 옳습니다. FWIW, 내 솔루션은 문자 데이터 프레임에서도 작동합니다. 문자로 변환되는 모든 데이터에 대한주의 사항
— Chinmay Patil

2
나는 unname(unlist(x))해결책이 조금 더 좋다고 말할 것입니다 (더 효율적이고 투명합니다).
— Ben Bolker 2013 년

as.vector(t(df)[,1])나는 그것을 사랑한다! 정확히 내가 필요한 것!
— Uther Pendragon

7

다음은 dplyr기반 옵션입니다.

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()

2

행에 요인이 포함되어 있으면주의해야합니다. 예를 들면 다음과 같습니다.

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

다음은 또 다른 예입니다 (기본적으로 data.frame ()은 문자를 요소로 변환합니다)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

이 동작을 방지하려면 요소를 추출하기 전에주의해야합니다.

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"

-3

데이터 프레임의 열은 이미 벡터이므로 꺼내기 만하면됩니다. 원하는 열은 쉼표 앞이 아니라 뒤에 배치해야합니다.

> newV <- df[,1]
> newV
[1] 1 2 4 2

실제로 행을 원하는 경우 Ben이 말한대로 수행하고 나중에 올바르게 단어를 사용하십시오.


하지만 OP가 첫 번째 행을 원한다고 생각 합니까?
— Ben Bolker 2013-01-23

1
@BenBolker 아마도 그래서 ... 나는 그가 그의 직함과 질문이 그가 원하는 것을 원한다고 생각했습니다.
— Jonathan Christensen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.