首页 > 解决方案 > R将列名转换为行

问题描述

这是我的数据框:

    structure(list(alpha = c(0.1, 0.5), w = c(-0.00274974306224061, 
-0.000196166328114611), w_sd = c(0.0551810481758757, 0.0578592391790738
), x = c(33.1362337290378, 39.5506108643837), x_sd = c(3.1665690944253, 
3.326430870477), y = c(-5.31333502177223e-05, 0.000993858599634651
), y_sd = c(0.00281795557473473, 0.00521256102447982), z = c(7.36644492272648, 
0.948467218571388), z_sd = c(3.51648260725539, 3.66294238952056
)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"
))

我希望它看起来像这样:

alpha | stock | mean | sd
0.1   |   x   
0.5   |   x
0.1   |   y
0.5   |   y
0.1   |   z
0.5   |   z
0.1   |   z
0.5   |   z

其中 mean 和 sd 列分别包含来自w,x等和w_sd,x_sd等的值。

编辑:请注意,“alpha”是通过参数输入到函数中的parameter

标签: rtidyr

解决方案


我希望这是您正在寻找的:

  • 我首先必须对您的列名进行轻微修改,其中只有一个字母,因为我们需要它们作为mean值,然后它们将类似于您的其他列
  • 然后我创建了新的列名,一个stock用于存储所有前缀字母,另外两个由.value参数指定,以便名称的一部分sdmean将被定义为包含单元格值的变量
library(tidyr)

df %>%
  rename_with(~ gsub("([[:alpha:]])", "\\1_mean", .), !contains("sd") & !c(1)) %>%
  pivot_longer(!alpha, names_to = c("stock", ".value"), 
               names_pattern = "([[:alpha:]])_(.*)")

# A tibble: 8 x 4
  alpha stock       mean      sd
  <dbl> <chr>      <dbl>   <dbl>
1   0.1 w     -0.00275   0.0552 
2   0.1 x     33.1       3.17   
3   0.1 y     -0.0000531 0.00282
4   0.1 z      7.37      3.52   
5   0.5 w     -0.000196  0.0579 
6   0.5 x     39.6       3.33   
7   0.5 y      0.000994  0.00521
8   0.5 z      0.948     3.66

推荐阅读