对R中的多个数据子集应用迭代/非聚集函数
我试图运行一个需要在数据集子集内建立索引的函数,但在如何设置该函数方面遇到了麻烦。具体地说,我试图计算给定年份内沿着特定横断面的距离,因此对于每个子集,我需要1)确定横断面中的端点,2)计算从该端点到子集内所有其他位置的直线上的欧几里德距离 如果我将整个数据集视为单个横断面,则该函数似乎有效:对R中的多个数据子集应用迭代/非聚集函数,r,function,dplyr,data.table,R,Function,Dplyr,Data.table,我试图运行一个需要在数据集子集内建立索引的函数,但在如何设置该函数方面遇到了麻烦。具体地说,我试图计算给定年份内沿着特定横断面的距离,因此对于每个子集,我需要1)确定横断面中的端点,2)计算从该端点到子集内所有其他位置的直线上的欧几里德距离 如果我将整个数据集视为单个横断面,则该函数似乎有效: df <- data.frame( Transect = c(rep(1,4),rep(2,4)), YYYY = c(2015,2015,2016,2016,2015,2015,2016,
df <- data.frame(
Transect = c(rep(1,4),rep(2,4)),
YYYY = c(2015,2015,2016,2016,2015,2015,2016,2016),
X = seq(2,16, by = 2),
Y = c(1,2,3,5,6,13,22,31))
df$dist <- NA
f <- function(X, Y) {
xs_start <- match(min(X), X) #assumes no transects are perfectly N-S
for (n in 1:length(X)){
dist[n] <- (((Y[n]-Y[xs_start])^2)+((X[n]-X[xs_start])^2))^.5
}
return(dist)
}
attach(df)
f(X, Y)
detach(df)
使用dplyr
也是一种选择,但我也不知道如何使它适用于不聚合数据的函数
library(dplyr)
df %>%
group_by(Transect, YYYY) %>%
mutate(dist = f(X, Y))
上述代码导致错误:列“dist”的长度必须为2(组大小)或1,而不是8
有什么想法吗?提前谢谢 要添加一列
dist
,计算从终点位置(最小X坐标)到每个横断面年组中所有其他位置的欧几里德距离,可以执行以下操作:
##数据
df%
分组依据(样条,YYYY)%>%
突变(dist=sqrt((Y-Y[which.min(X)])^2+(X-min(X))^2))%>%
解组()
#>#A tibble:8 x 5
#>样带YYYY X Y区
#>
#> 1 1 2015 2 1 0
#> 2 1 2015 4 2 2.24
#> 3 1 2016 6 3 0
#> 4 1 2016 8 5 2.83
#> 5 2 2015 10 6 0
#> 6 2 2015 12 13 7.28
#> 7 2 2016 14 22 0
#> 8 2 2016 16 31 9.22
##使用data.table
库(数据表)
setDT(df)[,dist:=sqrt((Y-Y[which.min(X)])^2+(X-min(X))^2),by=c(“横断面”,“YYYY”)][]
#>样带YYYY X Y区
#> 1: 1 2015 2 1 0.000000
#> 2: 1 2015 4 2 2.236068
#> 3: 1 2016 6 3 0.000000
#> 4: 1 2016 8 5 2.828427
#> 5: 2 2015 10 6 0.000000
#> 6: 2 2015 12 13 7.280110
#> 7: 2 2016 14 22 0.000000
#> 8: 2 2016 16 31 9.219544
要添加一列dist
,计算从终点位置(最小X坐标)到每个横断面年组中所有其他位置的欧氏距离,可以执行以下操作:
##数据
df%
分组依据(样条,YYYY)%>%
突变(dist=sqrt((Y-Y[which.min(X)])^2+(X-min(X))^2))%>%
解组()
#>#A tibble:8 x 5
#>样带YYYY X Y区
#>
#> 1 1 2015 2 1 0
#> 2 1 2015 4 2 2.24
#> 3 1 2016 6 3 0
#> 4 1 2016 8 5 2.83
#> 5 2 2015 10 6 0
#> 6 2 2015 12 13 7.28
#> 7 2 2016 14 22 0
#> 8 2 2016 16 31 9.22
##使用data.table
库(数据表)
setDT(df)[,dist:=sqrt((Y-Y[which.min(X)])^2+(X-min(X))^2),by=c(“横断面”,“YYYY”)][]
#>样带YYYY X Y区
#> 1: 1 2015 2 1 0.000000
#> 2: 1 2015 4 2 2.236068
#> 3: 1 2016 6 3 0.000000
#> 4: 1 2016 8 5 2.828427
#> 5: 2 2015 10 6 0.000000
#> 6: 2 2015 12 13 7.280110
#> 7: 2 2016 14 22 0.000000
#> 8: 2 2016 16 31 9.219544
即使没有分组,函数也会给出错误data@akrun即使在重新启动R会话并清除环境之后,当我复制并粘贴第一段代码时,函数也会为我生成一个向量——你得到了什么错误?我得到了,距离[n]中有(df,f(X,Y))错误@akrun我使用attach试图复制dplyr/data.table中将要发生的语法,所以我不想使用“df$”——现在我要回顾一下代码,这些代码似乎也一直延续到我进行子集设置时。如果我将函数更改为引用整个数据帧,并使用df$X等对所有内容进行索引,它将运行。这似乎也会使子集部分的工作复杂化…如果函数没有分组,也会给出错误data@akrun即使在重新启动R会话并清除环境之后,当我复制并粘贴第一段代码时,该函数也会为我生成一个向量——你会得到什么错误?我会用(df,f(X,Y))得到dist[n]@akrun中的错误我使用attach试图复制dplyr/data.table中将要发生的语法,所以我不想使用“df$”——现在我要回顾一下代码,这些代码似乎也一直延续到我进行子集设置时。如果我将函数更改为引用整个数据帧,并使用df$X等对所有内容进行索引,它将运行。这似乎也会使子集f中的工作复杂化
library(dplyr)
df %>%
group_by(Transect, YYYY) %>%
mutate(dist = f(X, Y))