在 R 中使用 NA 将多个变量从宽转为长

Bri*_*ian 3 pivot r dataframe tidyr

我目前正在尝试使用 R 中的pivot_longer 函数转置(宽到长)多个变量。

这是我所拥有的

primary_id = c("A1", "A2")
id1 = c("B1", "B2")
score1 = c("good", "bad")
id2 = c("C1", "C2")
score2 = c(NA, "neutral")
id3 = c("D1", "D2")
score3 = c("bad", "neutral")
id4 = c("E1", "E2")
score4 = c(NA, "good")
have = data.frame(primary_id, id1, score1, id2, score2, id3, score3, id4, score4)

have
  primary_id id1 score1 id2  score2 id3  score3 id4 score4
1         A1  B1   good  C1    <NA>  D1     bad  E1   <NA>
2         A2  B2    bad  C2 neutral  D2 neutral  E2   good
Run Code Online (Sandbox Code Playgroud)

请注意,我有 20 个 id 变量和 20 个 Score 变量(示例仅显示 4 个)

这就是我正在寻找的

  primary_id ids  scores
1         A1  B1    good
2         A1  C1    <NA>
3         A1  D1     bad
4         A1  E1    <NA>
5         A2  B2     bad
6         A2  C2 neutral
7         A2  D2 neutral
8         A2  E2    good
Run Code Online (Sandbox Code Playgroud)

任何建议/帮助将不胜感激!请注意,分数变量到处都有 NA。

Ony*_*mbu 5

在基数 R 中:

\n
reshape(have,-1, dir='long', sep='', idvar = 'primary_id')\n\n     primary_id time id   score\nA1.1         A1    1 B1    good\nA2.1         A2    1 B2     bad\nA1.2         A1    2 C1    <NA>\nA2.2         A2    2 C2 neutral\nA1.3         A1    3 D1     bad\nA2.3         A2    3 D2 neutral\nA1.4         A1    4 E1    <NA>\nA2.4         A2    4 E2    good\n
Run Code Online (Sandbox Code Playgroud)\n

在数据表中:

\n
library(data.table)\nmelt(setDT(have),1, patterns(id = '^id', score = '^score'))\n   primary_id variable id   score\n1:         A1        1 B1    good\n2:         A2        1 B2     bad\n3:         A1        2 C1    <NA>\n4:         A2        2 C2 neutral\n5:         A1        3 D1     bad\n6:         A2        3 D2 neutral\n7:         A1        4 E1    <NA>\n8:         A2        4 E2    good\n
Run Code Online (Sandbox Code Playgroud)\n

在整洁的宇宙中

\n
library(tidyverse)\npivot_longer(have, -1, names_to = '.value', names_pattern = '(\\\\D+)')\n\n# A tibble: 8 \xc3\x97 3\n  primary_id id    score  \n  <chr>      <chr> <chr>  \n1 A1         B1    good   \n2 A1         C1    NA     \n3 A1         D1    bad    \n4 A1         E1    NA     \n5 A2         B2    bad    \n6 A2         C2    neutral\n7 A2         D2    neutral\n8 A2         E2    good   \n
Run Code Online (Sandbox Code Playgroud)\n