programing

data.frame에서 단일 열의 이름을 변경하는 방법은 무엇입니까?

telebox 2023. 6. 11. 10:35
반응형

data.frame에서 단일 열의 이름을 변경하는 방법은 무엇입니까?

열이 하나 이상인 데이터 프레임이 있으면 사용할 수 있습니다.

colnames(x) <- c("col1","col2")

열 이름을 변경합니다.한 칸이면 어떻게 하나요?열이 하나만 있는 벡터 또는 데이터 프레임을 의미합니다.

예:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]

이는 변수의 정확한 위치를 기억할 필요가 없는 일반적인 방법입니다.

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

이 코드는 거의 다음과 같습니다.

  1. names(df)에서는 모든이조다니에 을 조사합니다.df
  2. [names(df) == old.var.name]합니다.
  3. <- 'new.var.name'새 변수 이름을 할당합니다.
colnames(trSamp)[2] <- "newname2"

두 번째 열의 이름을 설정하려고 합니다.개체에 열이 하나만 있으므로 명령에서 오류를 발생시킵니다.이 정도면 충분합니다.

colnames(trSamp) <- "newname2"
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

이지만, 이질은오질이수사있다습니용할제만지를 사용할 수 에 주목할 .setnamesdata.table꾸러미

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

이것은 또한 Hadley's를 사용하여 수행할 수 있습니다.plyr패지고, 리그키고rename기능.

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

위치를 알 수 없는 이름으로 이름을 바꾸고 한 번에 여러 개의 이름을 변경할 수 있습니다.예를 들어 병합을 수행한 후 다음과 같은 메시지가 표시될 수 있습니다.

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

그런 다음 다음을 사용하여 한 번에 이름을 바꿀 수 있습니다.

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13

열 이름을 바꾸는 가장 좋은 방법은 다음과 같이 dplyr 패키지를 사용하는 것입니다.

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

모든 데이터 집합에서 하나 이상의 열 이름을 바꿀 때도 동일하게 작동합니다.

우리는 사용할 수 있습니다.dplyr::rename_at되었지만) 으):

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • 파이프 체인에서 잘 작동하는
  • 이름이 변수에 저장될 때 편리합니다.
  • 이름 또는 열 인덱스와 함께 작업
  • 명료하고 간결한

데이터 프레임 열 이름을 하나씩 바꾸는 다음 스타일이 좋습니다.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

어디에

which(colnames(df) == 'old_colname')

특정 열의 인덱스를 기준으로 반환합니다.

d는 myDays 및 temp라는 이름의 데이터 프레임이라고 합니다."MyDays"의 이름을 "Date"로 변경하려면,

library(plyr)
rename(df,c("myDays" = "Date"))

아니면 파이프로, 당신은 할 수 있습니다.

dfNew      <- df %>% 
  plyr::rename(c("myDays" = "Date"))

이것은 이미 밖에 나와 있을 수 있지만, 저는 해결책을 찾는 동안 필드 이름을 바꾸는 것을 가지고 놀다가 즉흥적으로 이것을 시도했습니다.내 목적을 위해 일했습니다.

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

편집이 여기서 시작됩니다.

이것도 작동합니다.

library(dplyr)
df <- dplyr::rename(df, c("oldColName" = "newColName"))

시도:

colnames(x)[2] <- 'newname2'

당신은 할 수 .rename.vars에 시대에gdata꾸러미

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

이 기능은 변경할 변수 이름이 두 개 이상 있거나 변수 이름에 일부 텍스트를 추가하거나 앞에 추가하려는 경우에 특히 유용하며 다음과 같은 작업을 수행할 수 있습니다.

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

변수 이름의 하위 집합에 텍스트를 추가하는 예는 https://stackoverflow.com/a/28870000/180892 을 참조하십시오.

당신은 또한 'Hmisc' 패키지의 'upData'를 시도할 수 있습니다.

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))

데이터 프레임에 열이 하나만 있는 경우 다음을 사용할 수 있습니다.names(trSamp) <- "newname2"

OP의 질문은 훌륭하고 진실하게 답변되었습니다.그러나 경우에 따라 유용한 트릭이 있습니다. 데이터 프레임에서 열 이름의 위치에 관계없이 열 이름의 부분 일치입니다.

이름에 대한 부분 일치:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

다른 예: "구문"이 있는 경우 부분 일치:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

이것들은 제가 오늘 다뤄야 할 예들입니다. 저는 공유할 가치가 있다고 생각했습니다.

단순히 열 이름을 names(dataset)[index_value] <- "new_col_name" 코드로 원하는 새 이름의 데이터 세트로 변경합니다.

원하는 이름으로 데이터 프레임에 새 열을 추가하고 기존 열에서 데이터를 가져옵니다.다음과 같이:

dataf$value=dataf$Article1Order

그런 다음 이전 열을 제거합니다! 다음과 같이 말합니다.

dataf$Article1Order<-NULL

이 코드는 어리석게 보일 수 있습니다!하지만 완벽하게 작동합니다...

찾았습니다colnames() 쉬운 논쟁 https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/row%2Bcolnames

데이터 프레임에서 일부 열 선택

df <- data.frame(df[, c( "hhid","b1005", "b1012_imp", "b3004a")])

선택한 열 이름을 순서대로 바꿉니다.

colnames(df) <- c("hhid", "income", "cost", "credit")

이름과 값을 확인합니다.

names(df);head(df)

우리는 사용할 수 있습니다.rename_with함수를 사용하여 열 이름을 변경하는 방법(stringr예를 들어 함수).

다음 데이터를 고려합니다.df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

모든 변수 이름 바꾸기dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

이름 파티클로 이름 바꾸기dplyr동사(starts_with,ends_with,contains,matches, ...).

예제 사용.(x변수):

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

클래스 테스트의 많은 기능을 사용하여 클래스별로 이름 바꾸기is.integer,is.numeric,is.factor...

예제 사용is.integer(y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

경고:

경고 메시지: 1: instri_replace_first_regex(문자열, 패턴, fix_replacement(교체): 더 긴 개체 길이의 배수가 아닙니다. 2: 이름 [cols] <- .fn(names[cols], ...): 바꿀 항목 수가 교체 길이의 배수가 아닙니다.

그것은 단지 모순이기 때문에 관련이 없습니다.seq_along(.)교체 기능을 사용합니다.

나는 계속 이것에 대해 생각했고 다음과 같은 기능을 생각해냈습니다.

renamecols <- function(df, oldnames, newnames) {

  #   _______________________________________
  #   Defenses                               ####
  stopifnot( exprs = {
    is.data.frame(df)
    length(oldnames) == length(newnames)
    # all(oldnames %in% names(df))
  }
  )

  #   ___________________________________________
  #   Computations                              ####
  df_names <- names(df)

  old_position <- which(oldnames %in% df_names)
  old_available <- oldnames[old_position]
  new_available <- newnames[old_position]

  tochange <- vector(length = length(old_available))

  for (i in seq_along(old_available)) {
    tochange[i] <- which(df_names %in% old_available[i])
  }

  names(df)[tochange] <- new_available

  return(df)

}

큰 데이터 세트에서 테스트할 수 있으며 비교적 빠릅니다.물론, 그렇게 빠르지는 않을 것입니다.data.table::setnames()그러나 이것은 기본 R 작업에 유용한 솔루션입니다.

이 접근 방식의 좋은 점은 새 이름과 오래된 이름이 어떤 순서로든 존재할 수 있고 데이터에 이전 이름이 존재할 필요조차 없으며 무시된다는 것입니다.유일한 요구 사항은 이전 이름과 새 이름이 직접 일치하는 것입니다.

n        <- 3
l        <- as.list(1:(length(letters)*n))
nn       <- expand.grid(l = letters, n = 1:n)
names(l) <- paste0(nn$l, nn$n)
df       <- as.data.frame(l)

oldnames <- sample(names(df), floor(length(names(df))/3))
newnames <- paste0("new_", oldnames)

renamecols(df, oldnames, newnames) |> 
  names()
#>  [1] "new_a1" "b1"     "new_c1" "d1"     "new_e1" "f1"     "new_g1" "h1"    
#>  [9] "i1"     "j1"     "k1"     "new_l1" "new_m1" "n1"     "o1"     "p1"    
#> [17] "new_q1" "r1"     "s1"     "t1"     "u1"     "new_v1" "new_w1" "new_x1"
#> [25] "y1"     "z1"     "new_a2" "b2"     "c2"     "d2"     "e2"     "f2"    
#> [33] "new_g2" "h2"     "new_i2" "new_j2" "k2"     "l2"     "m2"     "n2"    
#> [41] "new_o2" "p2"     "q2"     "new_r2" "s2"     "t2"     "u2"     "new_v2"
#> [49] "w2"     "x2"     "y2"     "z2"     "a3"     "new_b3" "new_c3" "d3"    
#> [57] "new_e3" "f3"     "g3"     "h3"     "new_i3" "j3"     "k3"     "l3"    
#> [65] "m3"     "n3"     "o3"     "p3"     "new_q3" "r3"     "s3"     "new_t3"
#> [73] "new_u3" "new_v3" "new_w3" "x3"     "y3"     "z3"

reprex v2.0.2를 사용하여 2023-05-04에 생성됨

library(dplyr)
rename(data, de=de.y)

언급URL : https://stackoverflow.com/questions/7531868/how-to-rename-a-single-column-in-a-data-frame

반응형