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)
我有两个具有共享因子水平 ("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)