#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, это было именно то, что мне было нужно! 🙂