如何编写代码以加快手动过程

时间:2017-10-18 12:39:00

标签: r

有人可以帮我提一些为我的问题创建代码的技巧吗?一步一步我能够解决一些问题,但我不知道如何开始编写循环和我自己的功能来加快我的工作。下面,您可以看到我的最后一个问题,因为我很容易完成小数据集,但问题是当我有更大的数据集时(当我需要创建30和更多" diff"列时)。

谢谢你的时间:)

id=c(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0)
distance=c(43.59304,  152.66197,  208.00968,  272.92662,  380.79429,  
469.62269,  556.72725,734.29125,  796.42570,  873.09448, 1040.64550)
c=data.frame(id,distance)
c
c[paste("diff",1:3, sep="")]=NA 
c$diff1=abs(c[c$id>0,][1,2]-c$distance)
c$diff2=abs(c[c$id>0,][2,2]-c$distance)
c$diff3=abs(c[c$id>0,][3,2]-c$distance)
c
c$min=apply(c[,c(3:5)], 1,FUN=min) 

编辑:

基本上我想计算ID = 0的每个点到ID = 1的最近点的最短距离。 数据"距离"是每个点沿线的距离。

Picture for better understening

1 个答案:

答案 0 :(得分:0)

中间的那部分可以通过使用outer完成,它将一个函数(你的函数,即绝对差)应用于每对两个输入向量。

因此我改变了符号,因为@Moody_Mudskipper提出了一个很好的观点:永远不要命名变量c

通常通过编写名称而不是列索引来明确引用列,以防万一您的列更改位置。

df <- structure(list(id = c(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0), 
                 distance = c(43.59304, 152.66197, 208.00968, 
                              272.92662, 380.79429, 469.62269, 
                              556.72725, 734.29125, 796.4257, 
                              873.09448, 1040.6455)), 
            .Names = c("id", "distance"), 
            row.names = c(NA, -11L), 
            class = "data.frame")

differences <- 
    outer(Y = df[df[["id"]] > 0, "distance"], X = df[, "distance"], FUN = function(x, y){
        abs(x - y)
    })

differences <- as.data.frame(differences)

names(differences) <- paste0("diff", seq_len(ncol(differences)))

differences[["min"]] <- apply(differences, 1, min)

cbind(df, differences)

正如您所看到的,这也适用于更多数据,因为它非常灵活。如果您的需求完全不同,请更具体,并分享更多信息。