r - 是否有更有效或更简洁的方法来使用 tidyr::gather 使我的数据看起来 'tidy' ?

标签 r dplyr tidyverse tidyr tibble

我是 tidyverse 的新手。我想看看我使用这个包中的函数是否尽可能高效/简洁。我怀疑我不是。

我的原始数据将键符号作为每个列名称的一部分。

   day         a_x        b_x        a_y         b_y
1    1 -0.56047565  1.2240818 -1.0678237  0.42646422
2    2 -0.23017749  0.3598138 -0.2179749 -0.29507148
...

我想让数据看起来整洁,像这样:

     day sym         x      y
 1     1 a      0.118   0.702
 2     2 a     -0.947  -0.262
...
11     1 b      1.44    0.788
12     2 b      0.452   0.769

这是我执行上述转换的代码:

library(tidyverse)
set.seed(123)

# example original table
d <- tibble(day=1:10,a_x=rnorm(10),b_x=rnorm(10),a_y=rnorm(10),b_y=rnorm(10))

# manipulations
d1 <- gather(d,a_x,b_x,key='sym',value='x') %>% mutate(sym=sub('_x','',sym)) %>% select(day,sym,x)
d2 <- gather(d,a_y,b_y,key='sym',value='y') %>% mutate(sym=sub('_y','',sym)) %>% select(day,sym,y)
d <- d1 %>% full_join(d2,by=c('day','sym'))

使用一些 tidyverse 函数以更少的行数或更有效地实现相同结果的更好方法是什么?

谢谢!

最佳答案

gather 已被淘汰,取而代之的是 pivot_longer,这使得这种转换更简单。

tidyr::pivot_longer(d, cols = -day, 
                    names_to = c('sym', '.value'), names_sep = '_')

# A tibble: 20 x 4
#    day sym        x      y
#* <int> <chr>  <dbl>  <dbl>
#1     1 a     -0.560 -1.07 
#2     1 b      1.22   0.426
#3     2 a     -0.230 -0.218
#4     2 b      0.360 -0.295
#...
#...

关于r - 是否有更有效或更简洁的方法来使用 tidyr::gather 使我的数据看起来 'tidy' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62556300/

相关文章:

r - 使用条件创建滞后变量并按 id 分组

r - 如何仅折叠 R 中的一些重复列

r - 为会计年度分配日期

r - 将列表的索引添加到 bind_rows?

r - 按(行)对的组合过滤

r - 按组对 data.frame 执行基于向量的操作

r - 使用 geom_dotplot 时绘图区域被截断

r - 以 R 或 dplyr 为基础的矩阵内的矩阵的平均值

r - gtsummary::tbl_regression 使用 pool_and_tidy_mice() 和 tidy_standardize()

r - 查找匹配条件的相邻行