lapply() 和 spline() 在 R 中的两个数据帧上,不合并

lapply() and spline() on two data frames in R , No Merging

我有两个具有共享因子水平 ("Auction_ID") 的数据框 (df, df5)。 所以 df 有 num.bidders 和 res.bid 和 Auction_ID。 df5,有 bid.points、Auction_ID。

我使用 smooth.splines() 函数来获取样条估计值,并将其保存为 df 中的新列(我不确定是否应将其保存在 df5 中)

    spline  <- smooth.spline(df$c_bidders,df$res.bid)

问题是如何在每个级别的 df$spline1 和 df5$bid.points 上使用 predict() 函数。我尝试使用 lapply 并发送 df,df5 作为函数的输入数据,但似乎我做不到。 喜欢:

 lapply(df,df5, function(t,t1)
   {
    tt<-predict(t$spline,t1$bid.points,deriv=0)$y 
   return(tt)}
    )

我不知道如果我引入一个列表变量,这会有帮助吗?

如果我使用 merge(df,df5,by="Auction_ID") 那么我将得到非常大的数据框:

   str(df1):
   Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    3967 obs. of  17 variables:

   str(df5)
   'data.frame':    18338 obs. of  2 variables:

    x <- merge(df5, df1, by = "Auction_ID")
    str(x)
    'data.frame':   501367 obs. of  19 variables:

( merge() with "all" options are already trieded.like all.y = TRUE ...给出相同数量的obs。这对我的目的不利。

您不想处理 50k 行的大型 df 的问题吗?

也许合并(又名加入)不是您所需要的。也许您只需要使用 "match" 函数来执行 vlookup,并将 df$spline1 的每个值与 df5$bid.points 的每个对应值(基于拍卖 ID)进行匹配。

看看这是否适合您的目的:

# assuming df5 is the target df:
df5$spline1 <- df$spline1[match(df$Auction_ID,df5$Auction_ID)]

## OR

# assuming df is the target df:
df$bid.points <- df5$bid.points[match(df$Auction_ID,df5$Auction_ID)]

考虑使用 Map 传递两个数据帧,其中 return 是 return 来自 predict() 的值列表:

列表return

Map(function(t, t1) predict(t$spline, t1$bid.points,deriv=0)$y, df, df5)

以上等同于将第二个数据帧作为 lapply() 中的第三个参数传递:

lapply(df, function(t,t1) { 
     predict(t$spline, t1$bid.points, deriv=0)$y
}, df5)

矩阵Return

或者,使用 sapply(),其中 return 是一个矩阵:

sapply(df, function(t,t1) { 
     predict(t$spline, t1$bid.points, deriv=0)$y
}, df5)

mapply()Map()背后的基本函数(它的非简化包装器)

mapply(function(t,t1) predict(t$spline, t1$bid.points, deriv=0)$y, df, df5)