代码之家  ›  专栏  ›  技术社区  ›  nouse

将predict()与lapply中的特定值向量一起用于数据帧列表。

r
  •  0
  • nouse  · 技术社区  · 6 年前

    我正在努力实现以下目标。我有一个数据帧列表,格式如下:

    list1 <- list(d1=data.frame(name=rep("d1",3), A=c(1,2,3), B=c(2,4,5)),
                  d2=data.frame(name=rep("d2",3), A=c(1,2,3), B=c(2,4,5)),
                  d3=data.frame(name=rep("d3",3), A=c(1,2,3), B=c(2,4,5)))
    

    对于中的每个数据帧 list1 ,我想拟合一个线性模型,然后使用此模型 predict() . 用于预测的值位于单独的数据帧中:

    new.values <- data.frame(name=c("d1","d2","d3"), B=c(3,4,5))
    

    每个模型只能使用一个值 new.values ,具有相应名称(例如 list$d1 价值 new.values[new.values$name == d1, ] new.values$B 我试过这个:

    predictions <- lapply(list1, function(x) predict(lm(A~B, data=x), new.values[new.values$name == names(x),], interval="predict")) 
    

    但预测仍然是空的:

    > predictions
    $d1
         fit lwr upr
    
    $d2
         fit lwr upr
    
    $d3
         fit lwr upr
    

    我想,因为r找不到任何可预测的值。如果我跑

    predictions <- lapply(list1, function(x) predict(lm(A~B, data=x), new.values, interval="predict"))  
    

    中的所有值 新的价值观 将用于每个模型。

    我该怎么解决?

    1 回复  |  直到 6 年前
        1
  •  1
  •   aosmith    6 年前

    “list1”中单个data.frames的名称是列名,而不是该列表项的整体名称。看到这个,快跑 names(list1[[1]]) .

    names(list1[[1]])
    "name" "A"    "B"  
    

    如果您想同时遍历列表和列表名称,那么 purrr::imap() 是有用的。

    匿名函数需要两个参数,我调用 x y ,分别引用列表和列表名称。

    library(purrr)
    imap(list1, function(x, y) predict(lm(A~B, data=x), new.values[new.values$name == y,], 
                                       interval="predict")) 
    $d1
           fit      lwr      upr
    1 1.571429 -2.48742 5.630277
    
    $d2
           fit      lwr      upr
    2 2.214286 -1.74179 6.170362
    
    $d3
           fit       lwr      upr
    3 2.857143 -1.589103 7.303388
    

    如果预测值也存储在列表中, purrr::map2() 对于同时遍历两个列表很有用。

    为了证明这一点我会 split 将“new.values”对象放入列表中。然后我可以通过 map2() . 我在这里使用公式符号,其中 .x 参考第一个列表 .y 而不是编写匿名函数。

    new.val.list = split(new.values, new.values$name)
    map2(list1, new.val.list, ~predict(lm(A~B, data=.x), .y, 
                                     interval="predict"))
    $d1
           fit      lwr      upr
    1 1.571429 -2.48742 5.630277
    
    $d2
           fit      lwr      upr
    2 2.214286 -1.74179 6.170362
    
    $d3
           fit       lwr      upr
    3 2.857143 -1.589103 7.303388