【问题标题】:pivot_longer() and merge two datasetspivot_longer() 并合并两个数据集
【发布时间】:2021-11-08 03:20:22
【问题描述】:

我有两个数据集。第一个是

issue_1_t1 <- c(10, 20, 30, 40)
issue_2_t1 <- c(10, 20, 30, 10)
issue_1_t2 <- c(10, 20, 30, 40)
issue_2_t2 <- c(10, 20, 30, 10)
issue_1_t3 <- c(10, 20, 30, 40)
issue_2_t3 <- c(10, 20, 30, 10)
area <- c(area1, area2, area3, area4)
area2 <- c(area10, area20, area30, area40)
df <- data.frame(issue_1_t1, issue_2_t1, issue_1_t2, issue_2_t2, issue_1_t3, issue_2_t3)

我想重新配置这些,使它们形成以下内容:

area    area2   issue1   issue2
area1   area10  10       10
area2   area20  20       20
area3   area30  30       30
area4   area40  40       40
area1   area10  10       10
area2   area20  20       20
area3   area30  30       30
area4   area40  40       40
area1   area10  10       10
area2   area20  20       20
area3   area30  30       30
area4   area40  40       40

到目前为止,我只能将数据集按时间段分成两个数据集,然后将它们堆叠在一起。我想知道是否有一种更有效的方法,只需要一行代码。

【问题讨论】:

  • 您的示例还没有运行。 areaarea2 中的值是否应该被引用(字符)值?

标签: r tidyverse


【解决方案1】:

你可以试试

library(dplyr)
library(reshape2)
library(tidyr)

df %>%
  melt %>%
  mutate(time = str_sub(variable, -1),
         issue = paste0("issue", str_split(variable, "_", simplify = T)[,2])) %>%
  select(time, issue, value) %>%
  group_by(issue) %>%
  arrange(issue) %>%
  mutate(n = 1, n = cumsum(n)) %>%
  pivot_wider(values_from = value, names_from = issue) %>%
  mutate(area = rep(area, max(n)/length(area)), area2 = rep(area2, max(n)/length(area2))) %>%
  select(-time, -n)

   issue1 issue2 area  area2 
    <dbl>  <dbl> <chr> <chr> 
 1     10     10 area1 area10
 2     20     20 area2 area20
 3     30     30 area3 area30
 4     40     10 area4 area40
 5     10     10 area1 area10
 6     20     20 area2 area20
 7     30     30 area3 area30
 8     40     10 area4 area40
 9     10     10 area1 area10
10     20     20 area2 area20
11     30     30 area3 area30
12     40     10 area4 area40

【讨论】:

    【解决方案2】:

    我认为共享的数据不完整,存在语法错误。我不明白你所说的两个数据集是什么意思(当只有一个 df 时),但我认为你所拥有的是这样的 -

    issue_1_t1 <- c(10, 20, 30, 40)
    issue_2_t1 <- c(10, 20, 30, 10)
    issue_1_t2 <- c(10, 20, 30, 40)
    issue_2_t2 <- c(10, 20, 30, 10)
    issue_1_t3 <- c(10, 20, 30, 40)
    issue_2_t3 <- c(10, 20, 30, 10)
    area <- c("area1", "area2", "area3", "area4")
    area2 <- c("area10", "area20", "area30", "area40")
    df <- data.frame(area, area2, issue_1_t1, issue_2_t1, issue_1_t2, 
                     issue_2_t2, issue_1_t3, issue_2_t3)
    df
    
    #   area  area2 issue_1_t1 issue_2_t1 issue_1_t2 issue_2_t2 issue_1_t3 issue_2_t3
    #1 area1 area10         10         10         10         10         10         10
    #2 area2 area20         20         20         20         20         20         20
    #3 area3 area30         30         30         30         30         30         30
    #4 area4 area40         40         10         40         10         40         10
    

    您可以使用tidyr 中的pivot_longer 来获得所需的形状。

    tidyr::pivot_longer(df, 
                        cols = starts_with('issue'), 
                        names_to = '.value', 
                        names_pattern = '(issue_\\d+)')
    
    #    area  area2  issue_1 issue_2
    #   <chr> <chr>    <dbl>   <dbl>
    # 1 area1 area10      10      10
    # 2 area1 area10      10      10
    # 3 area1 area10      10      10
    # 4 area2 area20      20      20
    # 5 area2 area20      20      20
    # 6 area2 area20      20      20
    # 7 area3 area30      30      30
    # 8 area3 area30      30      30
    # 9 area3 area30      30      30
    #10 area4 area40      40      10
    #11 area4 area40      40      10
    #12 area4 area40      40      10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多