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, чтобы после объединения отдельных листов я мог очистить все «ненужные» строки одним махом.