这很笨拙,但很有效。
例如,我将构建您描述的数据框:
selection <- c('sel1','sel2')
weight <- c(0.4,0.5)
df <- data.frame(selection = selection,weight = weight)
首先,确保selection 变量是character 类型,而不是factor。
df$selection <- as.character(df$selection)
要为新数据框创建名称列表,我们创建正确的字符串并粘贴到索引中。
indices <- sort(c(1:nrow(df),1:nrow(df)))
tags <- c(rbind(rep(names(df)[1],nrow(df)),rep(names(df)[2],nrow(df))))
new_names <- sapply(1:(2*nrow(df)),function(j) paste(tags[j],indices[j],sep="_"))
这里是笨拙的部分,写成一个函数。让我们一步一步来,将新变量添加到一个空的数据框中。
make_new_df <- function(df) {
new_df <- data.frame()
for (i in (1:length(new_names))) {
test <- i %% ncol(df)
if (test == 0) {
row_index <- floor(i/ncol(df))
col_index <- ncol(df)
} else {
row_index <- floor(i/ncol(df))+1
col_index <- (i %% ncol(df))
}
new_df[1,new_names[i]] <- df[row_index,col_index]
}
return(new_df)
}
让我们检查一下这是否适用于您的示例:
> make_new_df(df)
selection_1 weight_1 selection_2 weight_2
1 sel1 0.4 sel2 0.5
函数make_new_df 将适用于具有任意行数和列数的输入数据帧df,但它需要new_names 的正确配置。初步代码构建new_names 将适用于任意数量的行,但仅适用于两列(因此它在函数之外)。比如代码
selection <- c('sel1','sel2','sel3','sel4')
weight <- c(0.4,0.5,0.6,0.7)
df <- data.frame(selection = selection,weight = weight)
indices <- sort(c(1:nrow(df),1:nrow(df)))
tags <- c(rbind(rep(names(df)[1],nrow(df)),rep(names(df)[2],nrow(df))))
new_names <- sapply(1:(2*nrow(df)),function(j) paste(tags[j],indices[j],sep="_"))
make_new_df(df)
生产
selection_1 weight_1 selection_2 weight_2 selection_3 weight_3 selection_4 weight_4
1 sel1 0.4 sel2 0.5 sel3 0.6 sel4 0.7