填充data.frame中缺少的行

时间:2012-12-05 15:08:02

标签: r

我有两个data.framedfwf

df每个id的每个时间点都有一行。每个tpoint都缺少一些时间点(id)。

我的第二个data.framewf,每个tpoint分别有idspoint的开始和结束epoint

所以我想在df填写遗失的tpoints中缺少的行。以下是data.frames

df <- read.table(text= "id Gid tpoint dat1 dat2 dat3
                     1   a    1     x     x  55
                     1   a    3     x     x  44
                     1   a    4     x     x  33
                     2   a    2     x     x  66
                     2   a    3     x     x  43
                     3   b    4     x     x  42
                     3   b    5     x     x  36
                     4   b    4     x     x  33
                     4   b    5     x     x  65
                     4   b    6     x     x  77
                     5   b    4     x     x  72
                     5   b    5     x     x  25
                     5   b    6     x     x  12
                     5   b    7     x     x  09",header=TRUE)

 wf <- read.table(text= "id Gid spoint epoint
                     1   a    1     5
                     2   a    1     4
                     3   b    4     6
                     4   b    4     7
                     5   b    4     7",header=TRUE)

我想出了一种方法,可以在下面执行此操作:

library(plyr)

seqlist  <- apply(wf, 1, function(x) data.frame( id=x[1], 
                                                 Gid=x[2],
                                                 tpoint = seq(x[3], x[4])))
# bunch of warnings but I get the result

seqdf    <- ldply(seqlist, data.frame)
finaldf  <- merge(seqdf, df, by=c("Gid", "id", "tpoint"), all=TRUE)

虽然我得到了我想去的地方,但我得到了一堆丑陋的警告。但我猜所有警告都应该被禁止。在R中有无限的方法给猫皮肤。有没有更好的方法可以做到这一点我失踪了?

1 个答案:

答案 0 :(得分:1)

错误的发生是因为:

  1. 在对apply()的调用中,数据帧被强制转换为数组,在本例中为字符数组)
  2. 这意味着每一行现在都是一个命名的字符向量
  3. 当将指定的向量强制转换为数据框时,R会让您知道它正在丢弃所有名称。
  4. 要删除警告,请尝试以下操作:

    seqlist  <- apply(wf, 1, function(x){
      n <- as.numeric(x[4])-as.numeric(x[3])+1
      data.frame( id=rep(x[1], n), Gid=rep(x[2], n), tpoint = x[3]:x[4])
    })
    
    seqlist
    [[1]]
      id Gid tpoint
    1  1   a      1
    2  1   a      2
    3  1   a      3
    4  1   a      4
    5  1   a      5
    
    [[2]]
      id Gid tpoint
    1  2   a      1
    2  2   a      2
    3  2   a      3
    4  2   a      4
    
    [[3]]
      id Gid tpoint
    1  3   b      4
    2  3   b      5
    3  3   b      6
    
    [[4]]
      id Gid tpoint
    1  4   b      4
    2  4   b      5
    3  4   b      6
    4  4   b      7
    
    [[5]]
      id Gid tpoint
    1  5   b      4
    2  5   b      5
    3  5   b      6
    4  5   b      7