我有一个包含5列和数千行的大数据框。数据框“ d”如下所示:
Material Input_Wt Price
1 10 13
3 6 18
1 9 12
2 12 15
3 4 8
1 14 10
我需要对数据进行回归以预测不同输入权重下每种材料的价格。所采用的回归技术取决于唯一物料编号的记录数。因此,我需要处理与唯一物料编号有关的所有记录。一起。
所以我根据材料编号拆分数据。放入多个csv文件,并使用以下代码将其保存在工作目录中:
SPLIT.DATA <- split(d, d$Material, drop = FALSE)
lapply(names(SPLIT.DATA), function(nm)
write.csv(SPLIT.DATA[[nm]], paste0(nm, ".csv"), row.names = FALSE, quote = FALSE))
文件如下:
Material Input_Wt Price
1 10 13
1 9 12
1 14 10
Material Input_Wt Price
2 12 15
Material Input_Wt Price
3 6 18
3 4 8
然后我使用以下命令将所有这些文件调用到列表中的R上:
fileNames <- Sys.glob("*.csv")
分别对每个函数应用该功能,并将输出附加到单个文件中:
for (fileName in fileNames){
inp = read.csv(fileName,header = TRUE,sep = ",")
if (nrow(inp)==3){
print(RandomForest())
}else if (nrow(inp)==2){
print(KNN())
}else if (nrow(inp)==1){
print("Insufficient Data")
}
}
'KNN'和'RandomForest'是我定义的独立函数。
我最终得到期望的输出为:
Material Input_Wt Price Predicted_Price
1 10 13 14.5
1 9 12 13.8
1 14 10 9.2
2 12 15 16.1
3 6 18 17.5
3 4 8 9.7
这里的问题是这种方式效率不高。我首先必须将数据帧分割并写入多个csv文件,然后将它们逐个调用到R上以再次处理它们。
有没有一种方法可以直接完成整个过程而无需将数据帧写入CSV文件并再次调用它们?
答案 0 :(得分:1)
您的标题是by
(tapply
的面向对象包装器)的基本定义,与split
不同,它保留了一个函数参数。考虑定义一个函数来接收数据帧作为参数,并使用by
对其进行调用。
my_func <- function(inp){
if (nrow(inp)==3){
obj <- RandomForest()
}else if (nrow(inp)==2){
obj <- KNN()
}else if (nrow(inp)==1){
obj <- "Insufficient Data"
}
print(obj)
return(obj)
}
obj_list <- by(df, df$Material, my_func)
答案 1 :(得分:0)
不要拆分数据框,只需使用子设置语句即可:
df[df$Material == 1,]
subset(df, df$Material == 1)
或带有软件包dplyr
:
df %>%
filter(Material == 1)
如果您要基于每个组的条目数应用功能,请尝试
df %>%
group_by(Material) %>%
mutate(Predicated_Price=case_when(n() == 3 ~ "RandomForest()",
n() == 2 ~ "KNN()",
n() == 1 ~ "Insufficient Data"))