首页 > 解决方案 > 使用转置传播数据帧

问题描述

假设我有以下数据框

ID <- c("Tom" , "Tom", "Ana", "Ana", "Lena", "Lena")
Use <- c("F", "T", "T", "F", "T", "T")
df <- data.frame(ID, Use)

我想得到一个新的数据框,其中每一行是一个人,每一列是 Use1,Use2 的人。(每个人关联2个用途)

即我会等

Use1 <- c("F" , "T", "T")
Use2 <- c("T", "F", "T")
df_wanted <- data.frame(Use1, Use2)

那么理想情况下,row.names 将是人名,因此第 1 行是“Tom”,第 2 行是“Ana”,第 3 行是“Lena”。

我怎样才能做到这一点?我试过了gatherspreadmelt似乎找不到办法。

标签: rdplyrtidyversetidyr

解决方案


您可以使用以下解决方案。我只是想我会解释names_glue论点:

  • 您可以尝试不带names_glue参数的解决方案,您将看到您的新列名最终会像1& 2。但是,如果您想为重塑的数据集创建一个自定义名称,您可以在语法中使用.value参数。glue通过这种方式,我们将变量名称放入大括号{}中,以便将它们作为 R 代码进行评估。在这里,我们指定我们首先需要df从 ( Use) 中获取值的列的名称,然后是id列的值。我们还可以进行其他修改,例如添加下划线等
library(tidyr)

df %>%
  group_by(ID) %>%
  mutate(id = row_number()) %>%
  pivot_wider(names_from = id, values_from = Use, names_glue = "{.value}{id}")

# A tibble: 3 x 3
# Groups:   ID [3]
  ID    Use1  Use2 
  <chr> <chr> <chr>
1 Tom   F     T    
2 Ana   T     F    
3 Lena  T     T  

推荐阅读