我正在处理一个包含65个变量的数据框。第一个变量为一个人编目,接下来的64个变量表示该人与64个位置中的每一个的地理距离。使用R,我想创建一个新变量,将每个人的最短距离编目到这64个位置之一。
例如:如果人X距离位置35,50,79,100,450 ......英里,我希望新变量自动为它们分配35,因为这是最短的距离。 任何有关这方面的帮助将非常感激。谢谢。
答案 0 :(得分:12)
或者,使用Justin的例子:
df$shortest <- do.call(pmin,df[-1])
另请参阅?pmin
和?do.call
,并注意您可以使用列表索引删除数据框中的第一个变量(因此根本不使用任何逗号,另请参阅{{1} })
答案 1 :(得分:9)
df <- data.frame(let=letters[1:25], d1=sample(1:25,25), d2=sample(1:25,25), d3=sample(1:25,25))
df$shortest <- apply(df[,2:4],1,min)
第二行将函数min应用于每一行,并将其分配给data.frame df中的新列。有关第二行正在做什么的更多说明,请参阅?apply
。小心跳过第一列或任何不是距离的列:
apply(df,1,min)
给出了完全不同的答案,因为它找到了字符串的“min”。
> min(2:10)
[1] 2
> min(as.character(2:10))
[1] "10"
答案 2 :(得分:4)
我会通过应用来解决这个问题,但转换或其他方法可能有效。
#fake data set
ID=LETTERS[1:5], distance=matrixsample(
DF <- as.data.frame(matrix(sample(1:100, rep=T, 100), 5, 20))
DF <- data.frame(ID=LETTERS[1:5], DF)
#solution
DF$newvar <- apply(DF[,-1], 1, min)