【问题标题】:transforming a dataset from rows to columns in R在R中将数据集从行转换为列
【发布时间】:2018-10-28 13:27:58
【问题描述】:

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

selection  weight
sel1       0.4
sel2       0.5



selection_1   weight_1    selection_2   weight_2
sel1          0.4         sel2          0.6

我尝试了 reshape,但不确定要使用哪些参数。

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

【问题讨论】:

  • 你看过tidyr::spread()吗?它应该能够轻松实现您想要的。

标签: r dataframe reshape


【解决方案1】:

据我所知,我认为您需要先创建timevaridvar 才能使用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

您可以通过

取消选择idvar
cols_to_keep <- setdiff(names(df1_wide), "idvar")
df1_wide[cols_to_keep]

【讨论】:

    【解决方案2】:

    这很笨拙,但很有效。

    例如,我将构建您描述的数据框:

    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
    

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 2015-04-27
      • 1970-01-01
      • 2017-07-23
      • 2016-07-29
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      相关资源
      最近更新 更多