【问题标题】:How to use Pivot_longer to reshape from wide-type data to long-type data with multiple variables如何使用 Pivot_longer 将宽型数据重塑为具有多个变量的长型数据
【发布时间】:2020-08-17 14:37:09
【问题描述】:

我想问如何将以下数据框从宽型重塑为长型。 宽型数据如下。

重塑前的宽型数据:

long类型的数据,即我想获取的dataframe如下。

整形后的长型数据:

如果您能给我一些使用 pivot-longer 的提示,我们将不胜感激。我可以通过 BLS 和 ELS 分别重塑数据:

df_long_BLS <- df %>%
pivot_longer(
cols = starts_with("BLS_tchrG"),
names_to = "grade",
names_prefix = "BLS_tchrG",
values_to = "BLS_tchrG"
)
df_long_ELS <- df %>%
pivot_longer(
cols = starts_with("ELS_tchrG"),
names_to = "grade",
names_prefix = "ELS_tchrG",
values_to = "ELS_tchrG"
)

但是这样我需要合并两个单独的文件。我想知道如何在不制作 2 个单独文件的情况下对这些数据进行重塑。

【问题讨论】:

  • 请使用dput添加数据,而不是图像。 dput(head(df)).

标签: r tidyverse tidyr reshape2


【解决方案1】:

你可以试试:

tidyr::pivot_longer(df, cols = -ID_IE, 
                    names_to = c('.value', 'grade'), 
                    names_pattern = '(.*)(\\d+)')

# A tibble: 8 x 4
#  ID_IE grade BLS_tchrG ELS_tchrG
#  <dbl> <chr>     <dbl>     <dbl>
#1  2135 2             1         1
#2  2135 7             1         1
#3  2101 2             0         0
#4  2101 7             2         0
#5  2103 2             0         0
#6  2103 7             3         0
#7  2111 2             1         1
#8  2111 7             4         1

数据

试过这个数据:

df <- data.frame(ID_IE = c(2135, 2101, 2103, 2111), BLS_tchrG2 = c(1, 0, 0, 1), 
                 BLS_tchrG7 = 1:4,
                 ELS_tchrG2 = c(1, 0, 0, 1), ELS_tchrG7 = c(1, 0, 0, 1))

【讨论】:

  • 非常感谢您,罗纳克。你的建议对我很有效!似乎我需要熟悉如何使用“name_patterns”(尤其是正则表达式)和“.value”。我会自己寻找有关他们的信息。
  • 你能解释一下'\\d+'吗?
  • @Masoud 阅读帮助页面:?regex。这是一种匹配两个捕获类的模式:1) 是任何非数字,后跟 2) 一个或多个数字。
  • @IRTFM,我研究过。第一项捕获任何字符,直到长度>= 1 的数字被第二项捕获!谢谢,我想我现在明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多