将行合并为一行,替换NA

时间:2015-09-24 21:09:30

标签: r

我有以下数据框:(这只是一个小样本)

VALUE COUNT    AREA n_dd-2000 n_dd-2001 n_dd-2002 n_dd-2003 n_dd-2004 n_dd-2005 n_dd-2006 n_dd-2007 n_dd-2008 n_dd-2009 n_dd-2010
2    16  2431  243100        NA        NA        NA        NA        NA        NA  3.402293  3.606941  4.000461  3.666381  3.499614
3    16  2610  261000  3.805082  4.013435      3.98  3.490139  3.433857   3.27813        NA        NA        NA        NA        NA
4    16 35419 3541900        NA        NA        NA        NA        NA        NA        NA        NA        NA        NA        NA

我希望将所有三行合并为一行,将NA替换为每列中显示的数字(每列只有一个数字)。只需忽略前三列。我用了这段代码:

bdep[4,4:9] <- bdep[3,4:9]

用另一行中的数字替换NA,但无法弄清楚如何为所有列重复它。列4及其后的每行中有六个数字后跟20个NA的序列,所以我尝试使用lapply()seq()for循环,但是我的努力失败了。

2 个答案:

答案 0 :(得分:0)

我做了一个简单的解决方案,用零替换NA:s并每列添加所有行。这有用吗?

#data
bdep <- rbind(c(rep(NA,6),3.402293,3.606941,4.000461,3.666381,3.499614),
              c(3.805082,4.013435,3.98,3.490139,3.433857,3.27813, rep(NA,5)),
             c(rep(NA,11)))

#solution
bdep2 <- ifelse(is.na(bdep), 0, bdep)
bdep3 <- apply(bdep2, 2, sum)
bdep3 #the row you want?

答案 1 :(得分:0)

我最终通过修补我在其他帖子中找到的一些代码(特别是sequencingfor loops)来找到解决方案。我认为这将被视为凌乱的编码,所以我欢迎其他解决方案。这应该更好地描述我在OP中试图做的事情,在那里我试图概括太多。具体来说,我有17个变量,测量超过14年(即238列),并且在生成这些数据时发生了一些事情,其中​​变量的前6年在一行中,接下来的8年在另一行中,所以代替重新运行模型,我只想将两行合并为一个 以下是一些示例数据,简化了我的实际情况。

创建数据框:

df <- data.frame(
  VALUE = c(16, 16, 16),
  COUNT = c(2431, 2610, 35419),
  AREA = c(243100, 261000, 3541900),
  n_dd_2000 = c(NA, 3.805, NA),
  n_dd_2001 = c(3.402, NA, NA)
)

接下来的两行建立一个序列,在第4列开始一个模式,重复每1列,在第一行重复2次,在第二行重复1次,以及重复序列的次数:

info <- data.frame(start=seq(4, by=1, length.out=2), len=rep(1,2))
info2 <- data.frame(start=seq(5, by=1, length.out=1), len=rep(1,2))

这是我的真实数据集中的代码,我从第4列开始,每14行重复一次模式,输出17次,然后查看前6列,然后是8列:info <- data.frame(start=seq(4, by=14, length.out=17), len=rep(c(6,8),17))

下面的两个for循环分别在第2行和第1行到第3行的序列中写入指定的值:

foo = sequence(info$len) + rep(info$start-1, info$len)
foo2 = sequence(info2$len) + rep(info2$start-1, info2$len)
for(n in 1:length(foo)){
  df[3,foo[n]] <- df[2,foo[n]]
}
for(n in 1:length(foo2)){
  df[3,foo2[n]] <- df[1,foo2[n]]
}

然后我删除了前两行我得到了这些值,我留下了一行,没有NA:

df <- df[-(1:2),]