有人可以帮我提一些为我的问题创建代码的技巧吗?一步一步我能够解决一些问题,但我不知道如何开始编写循环和我自己的功能来加快我的工作。下面,您可以看到我的最后一个问题,因为我很容易完成小数据集,但问题是当我有更大的数据集时(当我需要创建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的最近点的最短距离。 数据"距离"是每个点沿线的距离。
答案 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)
正如您所看到的,这也适用于更多数据,因为它非常灵活。如果您的需求完全不同,请更具体,并分享更多信息。