重组行上的数据以减少 R 中数据帧中的 NA 数量

Restructure data on rows to decrease number of NAs in a dataframe in R

我有一个 392 行和 156 列的数据集,代表一个物种的检测和未检测。每列代表一个 'visit' 到现场进行调查,而每一行代表调查地点,持有 0 和 1 是否感兴趣的物种被记录在每个 'visits' 到现场,或者 NA 如果有在该特定时间段内没有进行任何调查。我按月汇总我的访问,因此每一列代表 'monthly visits',即给定年份内的 30 天间隔。鉴于我有几年的数据,我创建了跨越我有数据的所有年份的连续和连续的月期间。鉴于大多数站点在不同年份进行了调查,每个站点的几个列(时间段)都是唯一的,因此我有很多 NA:我有 1,646 条 0/1 和 59,506 NA 的记录。

我想重组我的数据库,以便我可以删除尽可能多的 NA,而不是将每一列视为特定时间段,而是将其视为通用时间间隔。因此,第 1 列不是例如 3/2008-4/2018 的特定时期,而是仅 'Survey 1',这将代表每个站点的不同月份和年份。通过在该站点的实际调查期之前删除每个站点的所有 NA,我可以拥有一个更干净、更小的数据库和更少的 NA。这个想法如下:

从这个 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")

谁能帮我创建一个代码来做到这一点?谢谢!

您可以使用 na.omit,然后使用 [ 进行子集化以获得等长的向量。

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