【问题标题】:dplyr: rearrange one row dataframe to multiple rowsdplyr:将一行数据帧重新排列为多行
【发布时间】:2021-11-11 23:21:43
【问题描述】:

我有几个小的数据框,每个都有一行,是中介分析的结果。我需要将单元格重新排列为三行,每行都有两个变量及其对应的系数。示例如下:

有数据:

lab_x lab_m lab_y    coef_xm    coef_my   coef_xy
    x     m     y   -0.21***    0.08*** -0.084***

想要数据:

var1   var2        coef
   x      m    -0.21***
   m      y     0.08***
   x      y   -0.084***

更新

稍微改变一下数据,我需要保留原来出现在DF中的变量名

df<-read.table(text="lab_x lab_m lab_y    coef_xm    coef_my   coef_xy
    v1    v2        v3  -0.21***    0.08*** -0.084***", header = TRUE)

想要:

 var1    var2        coef
   v1      v2    -0.21***
   v2      v3     0.08***
   v1      v3   -0.084***

【问题讨论】:

    标签: r dplyr tidyverse data-manipulation


    【解决方案1】:

    如果数据格式一致,您可以硬编码重塑:

    data.frame(var1 = c(df[1,1], df[1,2], df[1,1]), 
               var2 = c(df[1,2], df[1,3], df[1,3]),
               coef = as.character(df[1,4:6]))
    
    
      var1 var2      coef
    1   v1   v2  -0.21***
    2   v2   v3   0.08***
    3   v1   v3 -0.084***
    

    或者更隐晦地:

    v <- \(i) {as.character(df[1,i])} 
    data.frame(var1 = v(c(1,2,1)), var2 = v(c(2,3,3)), coef = v(c(4:6)))
    

    【讨论】:

      【解决方案2】:

      在base R中,您可以提取系数列的名称,获取相应的lab名称并创建一个数据框。

      col1 <- grep('coef', names(df), value = TRUE)
      col2 <- sub('coef_', '', fixed = TRUE, cols)
      
      do.call(rbind, lapply(strsplit(col2, ''), function(x) 
        setNames(df[paste0('lab_', x)], c('var1', 'var2')))) |>
        transform(coef = unlist(df[col1], use.names = FALSE))
      
      #  var1 var2      coef
      #1   v1   v2  -0.21***
      #2   v2   v3   0.08***
      #3   v1   v3 -0.084***
      

      【讨论】:

      • 这适用于系数,但我实际上需要保留在不同数据集中变化的原始变量名称。例如,请参阅更新。
      • 我想我误解了这个问题。如果有帮助,请查看更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 2013-08-30
      • 2023-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多