Присвоение значений подмножеству фрейма данных с динамически генерируемым именем - PullRequest
0 голосов
/ 09 июня 2018
for (BSyears in namelist) {                                      
    firstcol <- eval(as.name(BSyears))[,1]                        
    firstcol <- as.character(firstcol)
    EmptyRows <- sum(is.na(firstcol))                                       
    firstcol[is.na(firstcol)] <- paste("EMPTY_", 1:EmptyRows, sep = "")
    firstcol -> as.symbol(paste(BSyears,'[,1]', sep = ""))
}

Моя цель с этим кодом состоит в том, чтобы взять серию очищенных фреймов данных, сохраненных как фреймы данных, и заполнить все пустые записи в первом столбце фразой EMPTY_number.

namelistявляется вектором имен динамически генерируемых фреймов данных.

Цикл предназначен для чтения первого столбца всех фреймов данных, чьи имена хранятся в namelist, приведение его в вектор character, поисквсе записи NA, а затем заменить все записи NA по порядку на динамически сгенерированные строки EMPTY_1, EMPTY_2, EMPTY_3 и т. д.

Кажется, что здесь все работает, кроме этого последнегострока:

as.symbol(paste(BSyears,'[,1]', sep = "")) <- firstcol

Эта строка предназначалась для ссылки на первый столбец фрейма данных, заданного счетчиком цикла BSyears, и заменила его новым столбцом.

RStudio всегда выбрасываетэта ошибка, когда я пытаюсь запустить эту строку:

Error in as.symbol(paste(BSyears, "[,1]", sep = "")) <- firstcol : 
  could not find function "as.symbol<-"

Как я могу это исправить или переписать, чтобы она работала как задумано?Я полагаю, что могу нарушить неясное синтаксическое правило тем способом, которым оно написано в настоящее время.

Вот минимальный пример с одним входом:

> head(namelist)
[1] "BS2002" "BS2003" "BS2004" "BS2005" "BS2006" "BS2007"

> head(BS2002)
                                X1                    X2           X3
1 10-K for period ended 2002-12-31                  <NA>         <NA>
2                             <NA>          Dec. 31 2002 Dec. 31 2001
3                             <NA> (millions of dollars)         <NA>
4                           Assets                  <NA>         <NA>
5                   Current assets                  <NA>         <NA>
6        Cash and cash equivalents                  7229         6547

Если BSyears равно BS2002,предполагаемый конечный результат:

                                X1                    X2           X3
1 10-K for period ended 2002-12-31                  <NA>         <NA>
2                          EMPTY_1          Dec. 31 2002 Dec. 31 2001
3                          EMPTY_2 (millions of dollars)         <NA>
4                           Assets                  <NA>         <NA>
5                   Current assets                  <NA>         <NA>
6        Cash and cash equivalents                  7229         6547

Мотивация состояла в том, чтобы использовать full_join из dplyr, чтобы объединить все балансы, перечисленные в namelist, для создания единого баланса за несколько лет.full_join демонстрирует странное поведение, если by = X1 содержит какие-либо записи NA.

Этот скрипт предназначен для заполнения записей NA, чтобы после объединения отдельных листов я мог очистить все «ненужные» строки одним махом.

1 Ответ

0 голосов
/ 09 июня 2018

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

# convert the data frames to a list
library(purrr)
df_list <-map(namelist, ~ get(.x))


# function for the replacement
replace_nas <- function(df, col_no) {
  x <- df[col_no]

  x[is.na(x)] <- paste0("EMPTY_", 1:sum(is.na(x)))
  df[col_no] <- x
  df
}

tmp2 <- df_list %>% map(~ replace_nas(.x, col_no = 1))
...