【问题标题】:I am stuck in using "pivot_longer" in reshaping this dataset我被困在使用“pivot_longer”来重塑这个数据集
【发布时间】:2021-12-27 02:08:35
【问题描述】:
df <- tibble(
  uid = c("x1","x2","x3"),
  v13y1 = c(1,3,5),
  v13y1i = c(0,1,0),
  v13y1ii = c(1,0,0),
  v13y1iii = c(0,1,1),
  v13y1iv = c(0,2,0),
  v13y1v = c(1,3,0),
  v13y2 = c(2,3,2),
  v13y2i = c(0,1,0),
  v13y2ii = c(1,0,0),
  v13y2iii = c(0,1,1),
  v13y2iv = c(0,2,0),
  v13y2v = c(1,3,0)
)

我想根据多个列名拆分和重命名列。所需的输出数据框应具有如下列的名称:

df_new <- tibble(uid = c("x1","x1", "x2","x2", "x3","x3"),
                 v13y = c(1,2,3,3,5,2),
                 n1 = c(0,0,1,1,0,0),
                 n2 = c(1,1,0,0,0,0),
                 n3 = c(0,0,1,1,1,1),
                 n4 = c(0,0,2,2,0,0),
                 n5 = c(1,1,3,3,0,0))

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    这可能会有所帮助

    library(dplyr)
    library(tidyr)
    library(stringr)
    df %>% 
        rename_with(~ str_c(., "v13y"), matches("\\d$")) %>% 
        pivot_longer(cols = -uid, names_to = ".value", 
             names_pattern = ".*y\\d+(.*)$") %>% 
        rename_with(~ str_c('n', seq_along(.)), -(1:2))
    

    -输出

    # A tibble: 6 × 7
      uid    v13y    n1    n2    n3    n4    n5
      <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1 x1        1     0     1     0     0     1
    2 x1        2     0     1     0     0     1
    3 x2        3     1     0     1     2     3
    4 x2        3     1     0     1     2     3
    5 x3        5     0     0     1     0     0
    6 x3        2     0     0     1     0     0
    

    【讨论】:

    • @akron 这项工作完美。如果我想使用 names_to 而不是 rename_with 明确命名列 3:5 怎么办?
    • @jmutua 在names_to 中,您可以传递名称向量,但它应该与 names_pattern 或 names_sep 中的模式匹配
    • 谢谢,我想我可以在pivot_longer 中为列指定不同的名称。这意味着我必须重命名函数之外的列。
    • @jmutua 是的,您可能需要重新命名。使用data.table 中的melt,您可以在measure 中使用patterns,它也可以采用多种模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多