对R中的多个数据子集应用迭代/非聚集函数

对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,

我试图运行一个需要在数据集子集内建立索引的函数,但在如何设置该函数方面遇到了麻烦。具体地说,我试图计算给定年份内沿着特定横断面的距离,因此对于每个子集,我需要1)确定横断面中的端点,2)计算从该端点到子集内所有其他位置的直线上的欧几里德距离

如果我将整个数据集视为单个横断面,则该函数似乎有效:

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))