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


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.