объединение столбцов с помощью cbind в R

Вот мой код

library(readxl)
library(dplyr)
library(rowr)

filenames = list.files(pattern="*.xlsx")

readdata <- function(filename) {
  df <- read_excel(filename)
  vec <- select(df, ends_with("Course total (Letter)"))
  return(vec)
}



result <-lapply(filenames, readdata)

и результатом является список из 3 с разным количеством строк, который выглядит так

> > result [[1]]
> # A tibble: 24 x 1    `Course total (Letter)`    <chr>                    1 PASS                     2 FAIL                     3 PASS          
> 4 FAIL                     5 FAIL                     6 FAIL          
> 7 FAIL                     8 FAIL                     9 FAIL          
> 10 FAIL                   
> # ... with 14 more rows
> 
> [[2]]
> # A tibble: 87 x 1    `Course total (Letter)`    <chr>                    1 Pass                     2 Pass                     3 Pass          
> 4 Fail                     5 Fail                     6 Pass          
> 7 Fail                     8 Fail                     9 Fail          
> 10 Fail                   
> # ... with 77 more rows
> 
> [[3]]
> # A tibble: 23 x 1    `Course total (Letter)`    <chr>                    1 Fail                     2 Fail                     3 Fail          
> 4 Fail                     5 Pass                     6 Fail          
> 7 Pass                     8 Pass                     9 Fail          
> 10 Fail                   
> # ... with 13 more rows

Я хочу объединить все 3 таблицы в один фрейм данных, поэтому я попробовал это

result <- do.call("cbind.fill", result)

Теперь результат становится

 result
   Course.total..Letter. Course.total..Letter. Course.total..Letter.
1                   PASS                  Pass                  Fail
2                   FAIL                  Pass                  Fail
3                   PASS                  Pass                  Fail
4                   FAIL                  Fail                  Fail
5                   FAIL                  Fail                  Pass
6                   FAIL                  Pass                  Fail
7                   FAIL                  Fail                  Pass
8                   FAIL                  Fail                  Pass
9                   FAIL                  Fail                  Fail
10                  FAIL                  Fail                  Fail
11                  FAIL                  Fail                  Fail
12                  FAIL                  Fail                  Fail
13                  FAIL                  Fail                  Fail
14                  PASS                  Fail                  Pass
15                  FAIL                  Fail                  Fail
16                  PASS                  Fail                  Fail
17                  FAIL                  Fail                  Fail
18                  FAIL                  Pass                  Fail
19                  FAIL                  Pass                  Fail
20                  PASS                  Fail                  Fail
21                  FAIL                  Fail                  Fail
22                  FAIL                  Fail                  Pass
23                  FAIL                  Fail                  Fail
24                  FAIL                  Fail                  Fail
25                  PASS                  Fail                  Fail
26                  FAIL                  Fail                  Fail
27                  PASS                  Fail                  Fail
28                  FAIL                  Fail                  Pass
29                  FAIL                  Fail                  Fail
30                  FAIL                  Fail                  Pass
31                  FAIL                  Fail                  Pass
32                  FAIL                  Pass                  Fail
33                  FAIL                  Pass                  Fail
34                  FAIL                  Fail                  Fail
35                  FAIL                  Fail                  Fail
36                  FAIL                  Fail                  Fail
37                  FAIL                  Pass                  Pass
38                  PASS                  Fail                  Fail
39                  FAIL                  Fail                  Fail
40                  PASS                  Pass                  Fail
41                  FAIL                  Fail                  Fail
42                  FAIL                  Fail                  Fail
43                  FAIL                  Fail                  Fail
44                  PASS                  Fail                  Fail
45                  FAIL                  Fail                  Pass
46                  FAIL                  Pass                  Fail
47                  FAIL                  Pass                  Fail
48                  FAIL                  Pass                  Fail
49                  PASS                  Fail                  Fail
50                  FAIL                  Fail                  Fail
51                  PASS                  Fail                  Pass
52                  FAIL                  Fail                  Fail
53                  FAIL                  Pass                  Pass
54                  FAIL                  Fail                  Pass
55                  FAIL                  Pass                  Fail
56                  FAIL                  Fail                  Fail
57                  FAIL                  Pass                  Fail
58                  FAIL                  Fail                  Fail
59                  FAIL                  Fail                  Fail
60                  FAIL                  Pass                  Pass
61                  FAIL                  Fail                  Fail
62                  PASS                  Fail                  Fail
63                  FAIL                  Fail                  Fail
64                  PASS                  Fail                  Fail
65                  FAIL                  Pass                  Fail
66                  FAIL                  Fail                  Fail
67                  FAIL                  Fail                  Fail
68                  PASS                  Fail                  Pass
69                  FAIL                  Fail                  Fail
70                  FAIL                  Fail                  Fail
71                  FAIL                  Fail                  Fail
72                  FAIL                  Fail                  Fail
73                  PASS                  Fail                  Fail
74                  FAIL                  Fail                  Pass
75                  PASS                  Pass                  Fail
76                  FAIL                  Fail                  Pass
77                  FAIL                  Fail                  Pass
78                  FAIL                  Fail                  Fail
79                  FAIL                  Fail                  Fail
80                  FAIL                  Pass                  Fail
81                  FAIL                  Pass                  Fail
82                  FAIL                  Fail                  Fail
83                  FAIL                  Pass                  Pass
84                  FAIL                  Fail                  Fail
85                  FAIL                  Pass                  Fail
86                  PASS                  Fail                  Fail
87                  FAIL                  Fail                  Fail

Я хочу, чтобы пустые строки были заполнены как NA. В этом случае каждый столбец повторяется снова, чтобы соответствовать 87 строкам. Как это сделать?


person Manoj    schedule 18.04.2018    source источник


Ответы (1)


Вам нужно установить параметр fill для cbind.fill. Вы можете сделать это, добавив имя fill в свой список.

result[["fill"]] <- NA
result <- do.call("cbind.fill",result)

пример:

k <- list(c(1:23),c(1:87),c(1:24))
do.call("cbind.fill",k)
#behaves as the code in the question does

k <- list(c(1:23),c(1:87),c(1:24))
k[["fill"]] <-NA
do.call("cbind.fill",k)
#behaves as desired
person Pdubbs    schedule 18.04.2018