使用R组合重复列

时间:2016-11-11 00:21:52

标签: r

我有一个包含4列的表,其中列1,3和列2,4表示相同的变量。

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)

但我必须为几张桌子做这件事,而且我的方法看起来效率不高。是否可以使用%&gt;%或编写函数来执行此操作?

3 个答案:

答案 0 :(得分:2)

您可以使用duplicated功能动态识别和rbind重复列:

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

这将适用于任何表格,前提是重复列的顺序与原始列名称的顺序相同(例如c("Codes", "Description", "Codes", "Description")将起作用,c("Codes", "Description", "Description", "Codes")不起作用)并且没有额外的列表中没有重复。

答案 1 :(得分:2)

一个通用的答案,适用于任何数量的变量对,有点合理的顺序(代码,desc,代码,desc或代码,代码,desc,desc)是:

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 :(得分: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