我有一个包含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;%或编写函数来执行此操作?
答案 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