在R中将数据集从行转换为列

时间:2018-10-28 13:27:59

标签: r dataframe reshape

我想将数据集的行转换为列。

selection  weight
sel1       0.4
sel2       0.5



selection_1   weight_1    selection_2   weight_2
sel1          0.4         sel2          0.6

我尝试重塑形状,但不确定使用什么参数。

是否可以使用基本R函数进行此转换?

2 个答案:

答案 0 :(得分:0)

据我所知,我认为您首先需要创建lmfit.Modellibrary(sp) library(tspmeta) TSP225 <- read.csv("PLOT.csv") coords.df <- data.frame(long=TSP225$Long, lat=TSP225$Lat) coords.mx <- as.matrix(coords.df) # Compute distance matrix dist.mx <- dist(coords.mx) # Construct a TSP object tsp.ins <- tsp_instance(coords.mx, dist.mx ) # tour <- run_solver(tsp.ins, method="2-opt") #Plot autoplot(tsp.ins, tour) tour_length(tour) 才能使用timevar。 (即使idvar在这里是常量。)

reshape

您可以通过

取消选择idvar
df1_wide <- reshape(data = transform(df1,
                                     timevar = seq_len(nrow(df1)),
                                     idvar = 1L),
                    timevar = "timevar",
                    idvar = "idvar",
                    direction = "wide",
                    sep = "_")
df1_wide
#  idvar selection_1 weight_1 selection_2 weight_2
#1     1        sel1      0.4        sel2      0.5

答案 1 :(得分:0)

这很麻烦,但是可以。

对于该示例,我将构建您描述的数据框:

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