Удалить столбцы с заголовком «NA» из фреймов данных в списке? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть список фреймов данных, которые извлекаются из файла Excel. Некоторые из столбцов во фреймах данных имеют имя «NA», не содержат данных и бесполезны; поэтому я хотел бы отбросить их. Список содержит 9 фреймов данных, и большинство из них имеют столбцы с заголовком «NA».

Через несколько итераций R вернул ошибку или предупреждение. В том числе:

all_list <- all_list[!is.na(colnames(all_list))]
Warning message:
In is.na(colnames(all_list)) :
is.na() applied to non-(list or vector) of type 'NULL'

Вышеуказанное не соответствовало его назначению, поскольку столбцы NA все еще находятся в каждом фрейме данных.

all_list <- lapply(all_list, function(x){
colnames(x) <- x[!is.na(colnames(x))]
return(x)
})

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

Вот пример моих данных, демонстрирующих вышеупомянутые NA:

str(all_list)
List of 8
$ Retail        :'data.frame':  305 obs. of  25 variables:
$ NA                    : chr [1:305] NA "Variable" "Variable" "Variable" ...
$ TIMEPERIOD            : chr [1:305] NA "41640" "41671" "41699" ...

Редактировать: В случае, если неясно, эти пустые столбцы, заполненные символом NA, являются результатом форматирования в Excel для пробелов; однако, они не имеют смысла для анализа в R.

1 Ответ

0 голосов
/ 12 мая 2018

Вы очень близки к решению.Небольшое изменение в function, используемом с lapply, приведет вас к ожидаемому результату.

lapply пересекает каждый фрейм данных, и вашей функции нужно subset столбцы с именами от not equal до NA.

all_list < lapply(all_list, function(x){
  x[,colnames(x)  != "NA"]
})

# Verify changed data all_list
all_list[[1]]
#   col1 col2
# 1    g    x
# 2    j    z
# 3    n    p
# 4    u    o
# 5    e    b

Данные:

set.seed(1)

df1 <- data.frame(sample(letters, 5), sample(letters, 5), 1:5,
                  stringsAsFactors = FALSE)
names(df1) <- c("col1","col2","NA")
df2 <- data.frame(sample(letters, 5), sample(letters, 5), 11:15,
                  stringsAsFactors = FALSE)
names(df2) <- c("col1","col2","NA")
df3 <- data.frame(sample(letters, 5), sample(letters, 5), rep(NA, 5),
                  stringsAsFactors = FALSE)
names(df3) <- c("col1","col2","NA")
df4 <- data.frame(sample(letters, 5), sample(letters, 5), rep(NA, 5),
                  stringsAsFactors = FALSE)
names(df4) <- c("col1","col2","NA")

all_list <- list(df1,df2,df3,df4)
#check data
all_list[[1]]
#  col1 col2 NA
#1    g    x  1
#2    j    z  2
#3    n    p  3
#4    u    o  4
$5    e    b  5

# all_list[[2]], all_list[[3]] and all_list[[4]] contains similar values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...