태그 보관물: dataframe

dataframe

이름으로 여러 열 이름 바꾸기 : x =

누군가 이미이 질문을 했어야하는데 답을 찾을 수 없었습니다. 내가 가지고 있다고 :

x = data.frame(q=1,w=2,e=3, ...and many many columns...)

위치를 알 수없는 임의의 열 하위 집합을 다른 임의의 이름으로 이름을 바꾸는 가장 우아한 방법은 무엇입니까?

예를 들어 말 나는 이름을 바꿀 "q""e""A"하고 "B",이 작업을 수행하는 가장 우아한 코드는 무엇인가?

분명히 루프를 수행 할 수 있습니다.

oldnames = c("q","e")
newnames = c("A","B")
for(i in 1:2) names(x)[names(x) == oldnames[i]] = newnames[i]

그러나 더 나은 방법이 있는지 궁금합니다. 패키지 중 일부를 사용하고 있습니까? ( plyr::rename등)



답변

setnames로부터 data.table패키지에서 작동 data.frames 또는 data.tableS

library(data.table)
d <- data.frame(a=1:2,b=2:3,d=4:5)
setnames(d, old = c('a','d'), new = c('anew','dnew'))
d


 #   anew b dnew
 # 1    1 2    4
 # 2    2 3    5

변경은 참조에 의해 이루어 지므로 복사하지 마십시오 (data.frame에 대해서도!).


답변

dplyr을 사용하면 다음을 수행 할 수 있습니다.

library(dplyr)

df = data.frame(q = 1, w = 2, e = 3)

df %>% rename(A = q, B = e)

#  A w B
#1 1 2 3

또는 @ Jelena-bioinf가 제안한대로 벡터를 사용하려는 경우 :

library(dplyr)

df = data.frame(q = 1, w = 2, e = 3)

oldnames = c("q","e")
newnames = c("A","B")

df %>% rename_at(vars(oldnames), ~ newnames)

#  A w B
#1 1 2 3

LD Nicolas May 는 주어진 변경 사항이 다음 rename_at으로 대체 될 것이라고 제안 했습니다 rename_with.

df %>%
  rename_with(~ newnames[which(oldnames == .x)], .cols = oldnames)

#  A w B
#1 1 2 3


답변

너무 크지 않은 데이터 프레임에 대한 또 다른 솔루션은 (@thelatemail 답변을 기반으로 작성) 다음과 같습니다.

x <- data.frame(q=1,w=2,e=3)

> x
  q w e
1 1 2 3

colnames(x) <- c("A","w","B")

> x
  A w B
1 1 2 3

또는 다음을 사용할 수도 있습니다.

names(x) <- c("C","w","D")

> x
  C w D
1 1 2 3

또한 열 이름의 하위 집합의 이름을 바꿀 수도 있습니다.

names(x)[2:3] <- c("E","F")

> x
  C E F
1 1 2 3


답변

다음은 purrr::set_names()몇 가지 stringr작업 의 조합을 사용하여 여러 열의 이름을 바꾸는 가장 효율적인 방법 입니다.

library(tidyverse)

# Make a tibble with bad names
data <- tibble(
    `Bad NameS 1` = letters[1:10],
    `bAd NameS 2` = rnorm(10)
)

data
# A tibble: 10 x 2
   `Bad NameS 1` `bAd NameS 2`
   <chr>                 <dbl>
 1 a                    -0.840
 2 b                    -1.56
 3 c                    -0.625
 4 d                     0.506
 5 e                    -1.52
 6 f                    -0.212
 7 g                    -1.50
 8 h                    -1.53
 9 i                     0.420
 10 j                     0.957

# Use purrr::set_names() with annonymous function of stringr operations
data %>%
    set_names(~ str_to_lower(.) %>%
                  str_replace_all(" ", "_") %>%
                  str_replace_all("bad", "good"))

# A tibble: 10 x 2
   good_names_1 good_names_2
   <chr>               <dbl>
 1 a                  -0.840
 2 b                  -1.56
 3 c                  -0.625
 4 d                   0.506
 5 e                  -1.52
 6 f                  -0.212
 7 g                  -1.50
 8 h                  -1.53
 9 i                   0.420
10 j                   0.957


답변

그래서 최근에 열이 있는지 확실하지 않고 해당 열의 이름 만 바꾸고 싶다면 직접이 문제를 해결했습니다.

existing <- match(oldNames,names(x))
names(x)[na.omit(existing)] <- newNames[which(!is.na(existing))]


답변

@ user3114046의 답변을 기반으로 작성 :

x <- data.frame(q=1,w=2,e=3)
x
#  q w e
#1 1 2 3

names(x)[match(oldnames,names(x))] <- newnames

x
#  A w B
#1 1 2 3

이는 x데이터 세트 의 특정 열 순서에 의존하지 않습니다 .


답변

이렇게하면 모든 이름에서 해당 문자의 모든 발생이 변경됩니다.

 names(x) <- gsub("q", "A", gsub("e", "B", names(x) ) )