如何从多个列创建单个列?

Eva*_*van 4 r dataframe dplyr

我有df1:

Account   Score1 Score2 Score3 Score4 Score5 Score6  Random Random2
23        F30    G1     G5     H10    J18    NULL    3      4
42        NULL   NULL   NULL   NULL   NULL   NULL    5      6
56        D10    D11    NULL   NULL   NULL   NULL    6      2
59        X14    D3     F4     A11    A12    A13     8      2
41        D11    D12    NULL   NULL   NULL   NULL    7      7
45        C3     C10    R4     T5     NULL   NULL    1      1
30        C4     NULL   NULL   NULL   NULL   NULL    1      5
33        D2     D3     NULL   NULL   NULL   NULL    3      4
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的数据框,从 6 个分数列中获取值并将它们放入名为 的单个列中Score。如果有多个分数,那么我需要多行数据。

我希望输出df2看起来像:

Account   Score
23        F30
23        G1
23        G5
23        H10
23        J18
56        D10
56        D11
59        X14
59        D3
59        F4
59        A11
59        A12
59        A13
41        D11
41        D12
45        C3
45        C10 
45        R4
45        T5
30        C4
33        D2
33        D3
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

如果值为"NULL",那么我们可以将select感兴趣的列转换为长格式pivot_longer并filter输出"NULL"元素

\n
library(dplyr)\nlibrary(tidyr)\ndf1 %>% \n   select(Account, starts_with("Score")) %>% \n   pivot_longer(cols = -Account, names_to = NULL, values_to = "Score") %>% \n   filter(Score != "NULL")\n
Run Code Online (Sandbox Code Playgroud)\n

-输出

\n
# A tibble: 22 \xc3\x97 2\n   Account Score\n     <int> <chr>\n 1      23 F30  \n 2      23 G1   \n 3      23 G5   \n 4      23 H10  \n 5      23 J18  \n 6      56 D10  \n 7      56 D11  \n 8      59 X14  \n 9      59 D3   \n10      59 F4   \n# \xe2\x80\xa6 with 12 more rows\n
Run Code Online (Sandbox Code Playgroud)\n

数据

\n
df1 <- structure(list(Account = c(23L, 42L, 56L, 59L, 41L, 45L, 30L, \n33L), Score1 = c("F30", "NULL", "D10", "X14", "D11", "C3", "C4", \n"D2"), Score2 = c("G1", "NULL", "D11", "D3", "D12", "C10", "NULL", \n"D3"), Score3 = c("G5", "NULL", "NULL", "F4", "NULL", "R4", "NULL", \n"NULL"), Score4 = c("H10", "NULL", "NULL", "A11", "NULL", "T5", \n"NULL", "NULL"), Score5 = c("J18", "NULL", "NULL", "A12", "NULL", \n"NULL", "NULL", "NULL"), Score6 = c("NULL", "NULL", "NULL", "A13", \n"NULL", "NULL", "NULL", "NULL"), Random = c(3L, 5L, 6L, 8L, 7L, \n1L, 1L, 3L), Random2 = c(4L, 6L, 2L, 2L, 7L, 1L, 5L, 4L)),\n class = "data.frame", row.names = c(NA, \n-8L))\n
Run Code Online (Sandbox Code Playgroud)\n