r-如何从多个列创建单个列



我有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

我想制作一个新的数据框架,它从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

如果值是"NULL",那么我们可以select感兴趣的列,用pivot_longerfilter"NULL"元素转换为长格式

library(dplyr)
library(tidyr)
df1 %>% 
select(Account, starts_with("Score")) %>% 
pivot_longer(cols = -Account, names_to = NULL, values_to = "Score") %>% 
filter(Score != "NULL")

-输出

# A tibble: 22 × 2
Account Score
<int> <chr>
1      23 F30  
2      23 G1   
3      23 G5   
4      23 H10  
5      23 J18  
6      56 D10  
7      56 D11  
8      59 X14  
9      59 D3   
10      59 F4   
# … with 12 more rows

数据

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

基本R选项

u <- subset(
cbind(df[1], stack(df[-1])),
values != "NULL" & startsWith(as.character(ind), "Score"),
select = -ind
)
u[order(match(u$Account, df$Account)), ]

给出

Account values
1       23    F30
9       23     G1
17      23     G5
25      23    H10
33      23    J18
3       56    D10
11      56    D11
4       59    X14
12      59     D3
20      59     F4
28      59    A11
36      59    A12
44      59    A13
5       41    D11
13      41    D12
6       45     C3
14      45    C10
22      45     R4
30      45     T5
7       30     C4
8       33     D2
16      33     D3

最新更新