Реструктурируйте данные по строкам, чтобы уменьшить количество NAS в фрейме данных в R

#r #missing-data #database

#r #отсутствует-данные #База данных

Вопрос:

У меня есть набор данных из 392 строк и 156 столбцов, которые представляют обнаружения и необнаружения вида. Каждый столбец представляет «посещение» поля для опроса, тогда как каждая строка представляет обследованные участки, содержащие 0 и 1, был ли зарегистрирован интересующий вид при каждом из этих «посещений» поля, или NA, если в течение этого конкретного периода времени не проводилось обследование. Я распределил свои посещения по месяцам, поэтому каждый столбец представляет «ежемесячные посещения», то есть интервал в 30 дней в течение данного года. Учитывая, что у меня есть данные за несколько лет, я создал последовательные и последовательные месячные периоды, охватывающие все годы, за которые у меня есть данные. Учитывая, что большинство сайтов были обследованы в разные годы, несколько столбцов (периодов времени) уникальны для каждого сайта, и, таким образом, у меня МНОГО NAS: у меня есть 1646 записей либо 0/1, либо 59 506 NAs.

Я хочу реструктурировать свою базу данных таким образом, чтобы я мог удалить как можно больше NAS, обрабатывая каждый столбец не как определенный период времени, а как общий интервал времени. Таким образом, вместо столбца 1, например, определенного периода 3/2008-4/2018, будет только «Опрос 1», который будет представлять разные месяцы и годы для каждого сайта. Удалив все NAS каждого сайта до фактического периода опроса для этого сайта, я могу получить более чистую, меньшую базу данных с меньшим количеством NAs. Идея заключается в следующем:

Перейдите из этого df, который у меня есть:

 df <- read.table(text = "3/2008-4/2018 5/2008-6/2008 7/2009-8/2009 9/2009-10/2009 11/2009-12/2009 01/2010-02/2010 03/2010-04/2010 05/2010-06/2010 07/2010-08/2010
1 NA NA NA NA NA NA 1 1 1 
2 NA NA NA 1 0 NA NA NA NA
3 NA NA NA 0 0 NA NA NA NA
4 0 1 0 1 1 1 NA NA NA
5 0 1 NA NA NA 1 0 1 1")
 

К этому новому df:

 df_new <- read.table(text = "v1 v2 v3 v4 V5 V6
1 1 1 1 NA NA NA
2 1 0 NA NA NA NA
3 0 0 NA NA NA NA
4 0 1 0 1 1 1
5 0 1 1 0 1 1")
 

Кто-нибудь может помочь мне создать код для этого, пожалуйста? Спасибо!

Ответ №1:

Вы можете использовать na.omit , а затем подмножество using [ для получения векторов одинаковой длины.

 x <- apply(unname(df), 1, na.omit)
t(sapply(x, "[", 1:max(lengths(x))))
#  [,1] [,2] [,3] [,4] [,5] [,6]
#1    1    1    1   NA   NA   NA
#2    1    0   NA   NA   NA   NA
#3    0    0   NA   NA   NA   NA
#4    0    1    0    1    1    1
#5    0    1    1    0    1    1
 

Комментарии:

1. Спасибо, GKi, это было именно то, что мне было нужно! 🙂