【问题标题】:tidyr::pivot_longer() for multiple matching sets of names/valuestidyr::pivot_longer() 用于多个匹配的名称/值集
【发布时间】:2020-10-07 17:42:17
【问题描述】:

是否可以在一次pivot_longer() 调用中旋转更长的两组匹配的名称-值列?

这是一个玩具示例。我有两种值类型(a、b)和两种类型的值(一个数值和一个表示负数的二进制指示符)。是否可以在一个函数调用中将它们都重塑更长的时间?

此示例使用两个 pivot_longer() 调用并将它们连接在一起。

set.seed(1)

a_val = rnorm(10)
b_val = rnorm(10)
a_neg = factor(as.numeric(a_val < 0), levels = 0:1, labels = c("No", "Yes"))
b_neg = factor(as.numeric(b_val < 0), levels = 0:1, labels = c("No", "Yes"))

# random data
df <- data.frame(
    id = seq(1:10),
    a = a_val,
    b = b_val,
    a_low = a_neg,
    b_low = b_neg
)

full_join(
    df %>%
        select(id, a, b) %>%
        pivot_longer(cols = a:b, names_to = "value_type", values_to = "value"),
    df %>%
        select(id, a_low, b_low) %>%
        pivot_longer(cols = a_low:b_low, names_to = "value_type", names_pattern = "([ab])_low", values_to = "low"),
    by = c("id", "value_type")
)
#> # A tibble: 20 x 4
#>       id value_type   value low  
#>    <int> <chr>        <dbl> <fct>
#>  1     1 a          -0.626  Yes  
#>  2     1 b           1.51   No   
#>  3     2 a           0.184  No   
#>  4     2 b           0.390  No   
#>  5     3 a          -0.836  Yes  
#>  6     3 b          -0.621  Yes  
#>  7     4 a           1.60   No   
#>  8     4 b          -2.21   Yes  
#>  9     5 a           0.330  No   
#> 10     5 b           1.12   No   
#> 11     6 a          -0.820  Yes  
#> 12     6 b          -0.0449 Yes  
#> 13     7 a           0.487  No   
#> 14     7 b          -0.0162 Yes  
#> 15     8 a           0.738  No   
#> 16     8 b           0.944  No   
#> 17     9 a           0.576  No   
#> 18     9 b           0.821  No   
#> 19    10 a          -0.305  Yes  
#> 20    10 b           0.594  No

reprex package (v0.3.0) 于 2020 年 6 月 17 日创建

【问题讨论】:

    标签: r dplyr tidyverse tidyr


    【解决方案1】:

    我们可以重命名列'a'、'b'以添加后缀“_value”,然后在pivot_longer中使用names_sep="_"

    library(dplyr)
    library(tidyr)
    df %>% 
      rename_at(vars(a, b), ~ str_c(., "_value")) %>%
      pivot_longer(cols = -id, names_to = c("grp", ".value"), names_sep="_")
    # A tibble: 20 x 4
    #      id grp     value low  
    #   <int> <chr>   <dbl> <fct>
    # 1     1 a     -0.626  Yes  
    # 2     1 b      1.51   No   
    # 3     2 a      0.184  No   
    # 4     2 b      0.390  No   
    # 5     3 a     -0.836  Yes  
    # 6     3 b     -0.621  Yes  
    # 7     4 a      1.60   No   
    # 8     4 b     -2.21   Yes  
    # 9     5 a      0.330  No   
    #10     5 b      1.12   No   
    #11     6 a     -0.820  Yes  
    #12     6 b     -0.0449 Yes  
    #13     7 a      0.487  No   
    #14     7 b     -0.0162 Yes  
    #15     8 a      0.738  No   
    #16     8 b      0.944  No   
    #17     9 a      0.576  No   
    #18     9 b      0.821  No   
    #19    10 a     -0.305  Yes  
    #20    10 b      0.594  No   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 2022-01-08
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多