dplyr:将一行数据框重新排列为多行

dplyr: rearrange one row dataframe to multiple rows

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

有数据:

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***

在 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***

如果数据采用一致的格式,您可以对整形进行硬编码:

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)))