如何使用apply函数重写for循环

时间:2018-05-01 16:59:16

标签: r for-loop apply lapply

我有以下数据:

rand.sum <- function(n){
x <- sort(runif(n-1))
c(x,1) - c(0,x)
}

M <- t(replicate(8,rand.sum(8))) # data frame with probabilities

Test1 <- as.data.frame(t(replicate(1, rand.sum(8))))
Test2 <- as.data.frame(t(replicate(1, rand.sum(8))))
Test <- rbind(Test1,Test2) # Test data

ID1 <- c("ID1")
ID2 <- c("ID2")
ID <- rbind(ID1,ID2) #ID's

data <- cbind(ID,Test)

现在在令人敬畏的社区的帮助下,我有以下应用功能:

gemeinden_new <- lapply(1:dim(Test)[1], function(z)
                   as.data.frame(
                         matrix(sapply(1:8, function(i) sum(data[z,2:9] * M[,i])),
                                nrow=1, ncol=8)
                   ))

现在我想添加一个新列并根据df“data”中的数据填充它。

我提出了以下解决方案:

library(tibble)

gemeinden_new <- lapply(gemeinden_new, function(x){
                add_column(x, gemeindeschluessel = 0, .before = 1)
                 })

for(i in 1:dim(Test)[1]) { 
  z <- i
  gemeindeschluessel <- paste(data[z,1])
  gemeinden_new[[z]][z,1] <- gemeindeschluessel
}

虽然这有效但它不是很优雅,因为我正在使用大型数据集,我想解决for循环问题。是否有可能使用lapply重写for循环?我无法这样做。

最终列表解决方案应如下所示:

 # $ID1
    #    gemeindeschluessel      V1        V2         V3        V4         V5             V6         V7       V8
    # 1 ID1 0.0598796 0.1526457 0.08604147 0.2314867 0.06307882 0.2047462 0.07962943 0.122492

# $ID2
#    gemeindeschluessel      V1        V2         V3        V4         V5        V6         V7        V8
# 1 ID2 0.1385492 0.1047066 0.06278719 0.1710685 0.09209054 0.2519348 0.06434532 0.1145178

0 个答案:

没有答案