我目前有2个数据帧,需要填充大约25列,其中包含来自另一个数据帧的值,该数据帧对原始数据帧中的每一列具有不同的值。这里有一些可重现的代码(不是我的实际情况,但会让我知道我的数据是什么样的。)
set.seed(1)
val <- dnorm(rnorm(1200))
bin <- ifelse(val > .39,1,0)
df1 <- data.frame(matrix(data=bin,ncol=120,nrow=10))
colnames(df1) <- c(paste0("rule",c(1:100)),paste0("cond",c(1:20)))
df1[,101:120] <- 0
df2 <- data.frame(matrix(ncol=3,nrow=100))
colnames(df2) <- c("rule","category","value")
df2$rule <- c(paste0("rule",c(1:100)))
df2$category <- c(paste0("cond",c(rep(1:20,5))))
df2$value <- sample(c(rep(0,10),rep(2,5),4,6,8),100, replace = TRUE)
现在,我已经创建了一个for循环,它从df2中获取df1中我需要的必要数据但是我的实际数据集有超过400万行而for循环需要永远。这是代码:
for (i in 1:nrow(df1))
{
myRules <- colnames(df1[i, 1:100])[df1[i, 1:100] == 1]
myCatVals <- df2[df2$rule %in% myRules, 2:3]
myMaxes <- aggregate(myCatVals,list(myCatVals$cat),max)
df1[, (colnames(df1) %in% myMaxes$cat)] <- myMaxes$value
}
此循环旨在将df1中值为1的规则与df2中的类别和值进行匹配。但由于规则多于类别,因此可能存在冗余(即来自df1的列可以是30并且仅匹配20个唯一类别)。因此,我只想在每个类别中提取最大值,并在df1的'cond_“列中填充这些值。
有没有办法使用apply,mapply或其他一些函数来更快地完成这个循环的作用?