【问题标题】:Unstacking a column into several columns with differing number of rows [duplicate]将一列拆分为具有不同行数的几列[重复]
【发布时间】:2020-09-16 23:40:21
【问题描述】:

我有一个包含两列的数据框:

dat_test <- data.frame(code     = c("A", "A", "A", "A", "B", "B", "B", "C", "C"),
                       response = c("A", "AA", "AB", "ABC", "BC", "AB", "B", "CDE", "BC"),
                       stringsAsFactors = FALSE)

dat_test

  code response  n
1    A        A 69
2    A       AA 85
3    A       AB 10
4    A      ABC 87
5    B       BC  3
6    B       AB 79
7    B        B 50
8    C      CDE 81
9    C       BC 32

我现在想以某种方式(最好是在 tidyverse 中)取消堆叠/pivot_wider 这些数据,其中代码列被重新调整为三列,而行将只是来自响应列的值。这三个代码之间没有逻辑联系,即没有标识符可以告诉我代码“A”的哪个响应分别属于代码“B”和“C”的同一行。

所以基本上我只想要三列,将所有响应列为行,其他所有内容都填充为 NA。

我尝试了 tidyr 的 pivot_wider,但失败了。我看到在 pivot_wider 函数中有一些参数,比如 values_fill 和 values_fn,但我不知道是否可以使用这些参数来获得所需的行为。

预期结果是:

# A tibble: 4 x 3
  A     B     C    
  <chr> <chr> <chr>
1 A     BC    CDE  
2 AA    AB    BC   
3 AB    B     NA   
4 ABC   NA    NA

有什么想法吗?

我想我可以先创建一个额外的 id 列,从代码“A”的 1:4、代码“B”的 1:3 和代码“C”的 1:2 开始,但不知道我该怎么做这对于任何其他数据集都是动态的(即每个代码具有不同数量的代码和响应)。但是一旦我有了这样一个 id 列,旋转应该可以工作。

【问题讨论】:

标签: r pivot tidyr


【解决方案1】:

哦,天哪,没关系(可以关闭)。

创建 id 非常简单。这段代码就像一个魅力:

dat_test %>%
  group_by(code) %>%
  mutate(id = 1:n()) %>%
  ungroup() %>%
  pivot_wider(names_from = "code", values_from = "response")

并给出:

# A tibble: 4 x 4
     id A     B     C    
  <int> <chr> <chr> <chr>
1     1 A     BC    CDE  
2     2 AA    AB    BC   
3     3 AB    B     NA   
4     4 ABC   NA    NA 

【讨论】:

    【解决方案2】:

    你自己给了我答案。 :)

    answer <- dat_test %>% 
                group_by(code) %>% 
                mutate(id=row_number()) %>% 
                pivot_wider(names_from=code, values_from=response) %>% 
                ungroup()
    

    给予

    # A tibble: 4 x 4
         id A     B     C    
      <int> <chr> <chr> <chr>
    1     1 A     BC    CDE  
    2     2 AA    AB    BC   
    3     3 AB    B     NA   
    4     4 ABC   NA    NA   
    

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2022-01-24
      • 2015-01-13
      • 2021-12-06
      • 2017-03-28
      相关资源
      最近更新 更多