2016-11-11 1 views
1

동일한 변수를 나타내는 4 열과 1 열 2,4가있는 테이블이 있습니다.R을 사용하여 중복 된 열을 조합하십시오.

Codes Description  Codes  Description 
xxxxx describes xxxxx zzzzz  describes zzzzz 
yyyyy describes yyyyy 12345  describes 12345 

나는 지금 내가하여이 사용하고있는 중이 야

Codes Description  
xxxxx describes xxxxx  
zzzzz describes zzzzz 
yyyyy describes yyyyy 
12345 describes 12345 

에 테이블을 변환 할 :

df_temp <- df[,3:4] 
df <- df[, - c(3, 4)] 
df <- rbind(df, df_temp) 

을하지만 여러 테이블과 내 방법 아무튼 그것을해야 매우 효율적으로 보입니다. %> %를 사용하거나 함수를 작성하는 것이 가능합니까?

+1

는 열 순서가 왜 변경되지 않을 경우 'bind_r <- function (df) rbind (df [, 1 : 2], df [, 3 : 4])'아닌가? – bouncyball

+1

모든 테이블의 모든 열을 하나의 큰 테이블로 결합하려고합니까? 아니면 4 개의 열 테이블 각각에 대해 별도의 결합 된 테이블 2 열 테이블을 유지하려고합니까? – lmkirvan

+0

이상적으로 나는 모든 테이블을 하나의 큰 테이블에 쉽게 결합하고 싶습니다. – user6340762

답변

2
당신은 동적으로 식별 할 duplicated 기능을 사용할 수 있습니다

rbind 중복 열 :

combine_duplicates <- function(df) { 
    duplicate_columns <- duplicates(colnames(df)) 
    return(rbind(df[,duplicate_columns], df[,!duplicate_columns])) 
} 
combine_duplicates(df) 

이 모든 테이블에서 작동이 중복 열을 원래 열 이름과 동일한 순서로 항상 제공 (예 : c("Codes", "Description", "Codes", "Description")은 작동하지 않으며, c("Codes", "Description", "Description", "Codes")는 그렇지 않을 것입니다.) 테이블에 중복되지 않은 여분의 열은 없습니다. 다소 합리적인 순서 변수 쌍 (코드 DESC 코드, 내림차순 또는 코드, 코드, 내림차순, DESC)의 수에 대한 작동

2

일반화 답은

names(dat) <- make.unique(names(dat)[c(1:2,1:length(dat))])[-(1:2)] 
#[1] "Codes.1"  "Description.1" "Codes.2"  "Description.2" 
reshape(dat, direction="long", varying=1:4, timevar=NULL) 
# Codes Description id 
#1.1 xxxxx describesxxxxx 1 
#2.1 yyyyy describesyyyyy 2 
#1.2 zzzzz describeszzzzz 1 
#2.2 12345 describes12345 2 
2

목록 purrr에 기반 접근 방식 :

library(purrr) 

df %>% map(as.character) %>% # convert factors to character, leave as list 
    split(names(.)) %>% # split list by column names 
    map_df(flatten_chr) # unlist each element and reassemble to data.frame 

## # A tibble: 4 × 2 
## Codes  Description 
## <chr>   <chr> 
## 1 xxxxx describes xxxxx 
## 2 yyyyy describes yyyyy 
## 3 zzzzz describes zzzzz 
## 4 12345 describes 12345 

또는 기본 R에

,

as.data.frame(lapply(split(lapply(df, 
            as.character), 
          names(df)), 
        unlist)) 

## Codes  Description 
## 1 xxxxx describes xxxxx 
## 2 yyyyy describes yyyyy 
## 3 zzzzz describes zzzzz 
## 4 12345 describes 12345 
관련 문제