我正在尝试运行一个需要在数据集的子集中进行索引的函数,并且我在如何设置该功能方面遇到了麻烦。具体而言,我正在尝试在给定年内计算沿特定样带的距离,因此对于每个子集,我需要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)
但是,在数据子集上运行它一直给我带来麻烦。我可以使用data.table
和dplyr
成功将数据框架子集,但是在尝试在子集上运行功能时,我会遇到不同的问题。我发现的大多数文档都集中在汇总数据子集的方法上(有时是将摘要号加入整个组(。
使用 data.table
,我可以获取第一个样带以正确计算,但是其余的会产生NAS,然后将整个结果向量连接到每个组,而不仅仅是该子集的结果。
library(data.table)
dt <- data.table(df)
dt[,f(X, Y), by = .(Transect, YYYY)]
使用dplyr
也是一个选项,但同样,我不确定如何使其适用于不汇总数据的函数。
library(dplyr)
df %>%
group_by(Transect, YYYY) %>%
mutate(dist = f(X, Y))
上述代码在Error: Column 'dist' must be length 2 (the group size) or one, not 8
中导致。
有什么想法吗?预先感谢!
添加一个列dist
,该列计算欧几里得距离端点位置(最小的x坐标(到每个Transect年组中所有其他位置的距离,您可以做:
## data
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))
## with dplyr
library(dplyr)
df %>%
group_by(Transect, YYYY) %>%
mutate(dist = sqrt((Y - Y[which.min(X)])^2 + (X - min(X))^2)) %>%
ungroup()
#> # A tibble: 8 x 5
#> Transect YYYY X Y dist
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 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
## with data.table
library(data.table)
setDT(df)[, dist := sqrt((Y - Y[which.min(X)])^2 + (X - min(X))^2), by = c("Transect", "YYYY")][]
#> Transect YYYY X Y dist
#> 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