데이터 프레임의 열 이름 변경


399

"newprice"라는 데이터 프레임이 있고 (아래 참조) R의 프로그램에서 열 이름을 변경하고 싶습니다.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

실제로 이것이하는 일입니다.

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

각 열 이름이 다른 것처럼 보이기를 원하기 때문에 이것을 루프에 넣지 않았습니다.

프로그램을 R 콘솔에 붙여 넣으면 다음과 같은 결과가 나옵니다.

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

c()함수 c("premium")대신 함수를 사용하여 동등하게 시도 paste()했지만 아무 소용이 없습니다.

누군가 나를 알아낼 수 있습니까?


Dirk의 답변이 효과가 있다면 문제는 데이터 프레임이 아닌 행렬로 작업하고 있다는 것입니다. is.matrix또는으로 이를 확인할 수 있습니다 str.
IRTFM

3
dplyr에이 답변 :: 이름 바꾸기를 참조하십시오 stackoverflow.com/a/26146202/1831980
라스무스 라슨

8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen

오류는 코드 품질과 관련이 없습니다. 잘못된 기호를 사용하고 있습니다. 이 "는 R에 의해 인식되지 않습니다. 대신"를 사용하십시오. 같은 모양 일 수 있습니다. 그게 다야.
에도

답변:


594

colnames()기능을 사용하십시오 :

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

당신은 또한 하위 집합을 할 수 있습니다 :

R> colnames(X)[2] <- "superduper"

12
@Dirk 왜 colnames () 대신 names ()를 사용하지 않습니까?
Antoine Lizée

4
큰! 한 번에 여러 열을 하위 집합으로 만들 수도 있습니다 (빅 데이터 프레임에서 유용). colnames(X)[c(1,2)] <- c("good", "better")
metakermit

7
시도 setnames()data.table패키지로 제공된다. 같이 사용 무언가 setnames(DT,"b","B")또는setnames(DT,c("a","E"),c("A","F"))
dwstu

이상하게도, 데이터 프레임의 열 이름을 설정 한 후 오류 를 초래 q1하여 데이터 프레임을 변경하려고 하면 오류가 발생합니다 ( 열에 새 이름이 지정됨 ). 정말 실망 스럽습니다. dplyrq1 <- q1 %>% mutate(rel_count = count / 482462)Error in mutate_impl(.data, dots) : unknown column 'days'days
David Tonhofer 2012

176

나는 이것을 사용한다 :

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

7
감사합니다. 나는 이것이 R과 어떻게 든 성가신 생각 : 왜 당신이 인덱스 번호하지만 이전 이름 :( 사용하지 않으려면 그렇게 어려운 열 이름을 변경하는 것입니다
아르네

10
이 방법은 원래 이름을 알고있는 한 열의 위치에 대해 걱정할 필요가 없다는 장점이 있습니다. 이름을 바꾸려는 열의 위치를 ​​변경하는 코드를 나중에 변경하는 것처럼 선호되는 방법이라고 생각합니다.
Paulo S. Abreu

78

이 오류는 "스마트 따옴표"(또는 무엇이든)에 의해 발생합니다. 여기서의 교훈은 "따옴표를 스마트 인용 부호로 변환하는 '편집기'에 코드를 작성하지 마십시오"입니다.

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

또한 불필요하며 중복 paste("premium")호출 을 피하기 위해 paste공백을 두는 것이 좋습니다 <-(예 :) x <- -10; if(x<-3) "hi" else "bye"; x.


51

그냥 시도 했습니까?

names(newprice)[1]<-"premium"

?


42

이를 위해 권장되는 새로운 방법은 setNames기능 을 사용하는 것입니다. 참조하십시오 ?setNames. 이렇게하면의 새 복사본이 만들어 지므로 의도 한 경우 data.frame결과를 원본에 할당해야합니다 data.frame.

data_frame <- setNames(data_frame, c("premium","change","newprice"))

최신 버전의 R은 colnames이전 답변에서 제안한 방식 중 일부 를 사용하면 경고를 표시합니다 .

이것이 data.table대신에 data.table함수를 사용하면 setnames특정 열 이름이나 단일 열 이름 을 참조로 수정할 수 있습니다 .

setnames(data_table, "old-name", "new-name")

2
data.table이 아니라 data.frame을 요청했다고 생각합니다.
Helix123

35

나는 같은 문제가 있었고이 코드는 나를 위해 일했다.

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

간단히 말해서이 코드는 다음을 수행합니다.

names(data)데이터 프레임의 모든 이름을 살펴 봅니다 ( data)

[names(data) == oldVariableName]이름을 바꾸려는 변수 이름 ( oldVariableName)을 추출하고 <- "newVariableName"새 변수 이름을 지정합니다.


예를 들어 3 oldVariableNames 벡터가있는 경우 어떻게 작동합니까?
jiggunjer

내가 찾던 것-> 2 엄지 손가락!
SilSur

19

다른 사람들과 비슷합니다.

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

매우 간단하고 수정하기 쉽습니다.



10

이전 열 이름 만 알고있을 때 한 번에 여러 열을 제외한 모든 열의 이름을 바꾸어야하는 경우 colnames함수와 %in%연산자를 사용할 수 있습니다 . 예:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

이제 "나쁜"및 "최악의"를 "좋은"및 "최상의"로 변경하려고합니다. 당신이 사용할 수있는

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

결과

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C

1
이 코드는 열 이름의 순서가 삽입물의 순서와 같다고 가정합니다
Hillary Sanders

10

colname 함수로 열 이름을 변경하려면 이것을 사용하십시오.

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

8

다음을 수행하여 편집을 수행 할 수 있습니다.

newprice <- edit(newprice)

열 이름을 수동으로 변경하십시오.


벡터 및 요소에만 적용되지 않습니까? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabond

적어도 데이터 프레임에서 작동합니다. 그것이 내가 아는 것입니다.
Baykal

7

내 열 이름은 다음과 같습니다

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

Class and Sex의 열 이름을 변경하고 싶습니다

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")

7

와 몇 가지 옵션이 있습니다 dplyr::rename()dplyr::select():

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

세 가지 범위 변종도있다 dplyr::rename(): dplyr::rename_all()모든 열 이름, dplyr::rename_if()조건 열 이름을 타겟팅하고 dplyr::rename_at()라는 이름의 열을 선택하기위한이. 다음 예제는 공백과 마침표를 밑줄로 바꾸고 모든 것을 소문자로 변환합니다.

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() 비슷한 방식으로 사용할 수도 있습니다.

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

6

Scott Wilson의 답변을 수정하고 약간 확장하십시오.
data.frame의 setnames함수도 data.table의 기능을 사용할 수 있습니다 .

작업 속도가 빨라지지는 않지만 setnames참조로 열 이름을 업데이트하므로 메모리 소비가 더 효율적일 것으로 예상 할 수 있습니다 . address기능 으로 추적 할 수 있습니다 ( 아래 참조).

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

따라서 메모리 제한에 도달 한 경우이 제한을 대신 사용하는 것이 좋습니다.


3

도움이 될 수 있습니다.

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

1

2 개의 데이터 프레임이있는 경우 다음 작업

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

DF1의 이름을 다음과 같이 변경합니다

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