在计算函数内的加权平均值时出现错误“'x' 和 'w' 必须具有相同的长度”
error "'x' and 'w' must have the same length" in computing weighted mean within a function
我有这样的数据集:
df = read.table(text=' location total year TR TY TU TJ
A 822400 2010 0.09 0.09 0.07 0.07
A 822400 2010 0.13 0.08 0.08 0.06
B 822400 2010 0.18 0.07 0.10 0.05
B 565000 2009 0.05 0.05 0.04 0.04
B 565000 2009 0.07 0.04 0.04 0.03
A 565000 2008 0.10 0.03 0.05 0.02',header=T)
我想使用函数按年份和属性(TR、TY、TU 或 TJ)计算两个位置的总加权平均值。为此我这样写:
total.weighted.mean <- function(df, properties, years){
dff<-filter(df, year==years)
res<-dff%>%
group_by(location) %>%
mutate(wt = weighted.mean(total, properties))
print(res)
}
total.weighted.mean( df, properties = "TR", years = 2009:2010)
但是我在函数中遇到这个错误:
Error in weighted.mean.default(total, properties) :
'x' and 'w' must have the same length
当我从函数中计算出来时,我得到了这个:
location total year TR TY TU TJ wt
<chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 822400 2010 0.13 0.08 0.08 0.06 732310
2 B 565000 2009 0.07 0.04 0.04 0.03 732310
由于我们对不同位置的总值不同,所以为每个位置获得相同的重量是否正确?
主要问题是您将权重变量作为字符串传递。要告诉 dplyr
你的意思是数据集中的变量,你可以例如使用 .data
代词。此外,在过滤多年时,您应该使用 %in%
而不是 ==
:
library(dplyr)
df = read.table(text=' location total year TR TY TU TJ
A 822400 2010 0.09 0.09 0.07 0.07
A 822400 2010 0.13 0.08 0.08 0.06
B 822400 2010 0.18 0.07 0.10 0.05
B 565000 2009 0.05 0.05 0.04 0.04
B 565000 2009 0.07 0.04 0.04 0.03
A 565000 2008 0.10 0.03 0.05 0.02',header=T)
total.weighted.mean <- function(df, properties, years) {
dff<-filter(df, year %in% years)
res<-dff%>%
group_by(location) %>%
mutate(wt = weighted.mean(total, .data[[properties]]))
res
}
total.weighted.mean( df, properties = "TR", years = 2009:2010)
#> # A tibble: 5 x 8
#> # Groups: location [2]
#> location total year TR TY TU TJ wt
#> <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 A 822400 2010 0.09 0.09 0.07 0.07 822400
#> 2 A 822400 2010 0.13 0.08 0.08 0.06 822400
#> 3 B 822400 2010 0.18 0.07 0.1 0.05 719440
#> 4 B 565000 2009 0.05 0.05 0.04 0.04 719440
#> 5 B 565000 2009 0.07 0.04 0.04 0.03 719440
显然,出现此错误的一种方法是权重变量也在 'by' 语句中。我尝试了两个不同的权重变量,都是双倍的,但只有一个给出了错误。
我有这样的数据集:
df = read.table(text=' location total year TR TY TU TJ
A 822400 2010 0.09 0.09 0.07 0.07
A 822400 2010 0.13 0.08 0.08 0.06
B 822400 2010 0.18 0.07 0.10 0.05
B 565000 2009 0.05 0.05 0.04 0.04
B 565000 2009 0.07 0.04 0.04 0.03
A 565000 2008 0.10 0.03 0.05 0.02',header=T)
我想使用函数按年份和属性(TR、TY、TU 或 TJ)计算两个位置的总加权平均值。为此我这样写:
total.weighted.mean <- function(df, properties, years){
dff<-filter(df, year==years)
res<-dff%>%
group_by(location) %>%
mutate(wt = weighted.mean(total, properties))
print(res)
}
total.weighted.mean( df, properties = "TR", years = 2009:2010)
但是我在函数中遇到这个错误:
Error in weighted.mean.default(total, properties) :
'x' and 'w' must have the same length
当我从函数中计算出来时,我得到了这个:
location total year TR TY TU TJ wt
<chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 822400 2010 0.13 0.08 0.08 0.06 732310
2 B 565000 2009 0.07 0.04 0.04 0.03 732310
由于我们对不同位置的总值不同,所以为每个位置获得相同的重量是否正确?
主要问题是您将权重变量作为字符串传递。要告诉 dplyr
你的意思是数据集中的变量,你可以例如使用 .data
代词。此外,在过滤多年时,您应该使用 %in%
而不是 ==
:
library(dplyr)
df = read.table(text=' location total year TR TY TU TJ
A 822400 2010 0.09 0.09 0.07 0.07
A 822400 2010 0.13 0.08 0.08 0.06
B 822400 2010 0.18 0.07 0.10 0.05
B 565000 2009 0.05 0.05 0.04 0.04
B 565000 2009 0.07 0.04 0.04 0.03
A 565000 2008 0.10 0.03 0.05 0.02',header=T)
total.weighted.mean <- function(df, properties, years) {
dff<-filter(df, year %in% years)
res<-dff%>%
group_by(location) %>%
mutate(wt = weighted.mean(total, .data[[properties]]))
res
}
total.weighted.mean( df, properties = "TR", years = 2009:2010)
#> # A tibble: 5 x 8
#> # Groups: location [2]
#> location total year TR TY TU TJ wt
#> <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 A 822400 2010 0.09 0.09 0.07 0.07 822400
#> 2 A 822400 2010 0.13 0.08 0.08 0.06 822400
#> 3 B 822400 2010 0.18 0.07 0.1 0.05 719440
#> 4 B 565000 2009 0.05 0.05 0.04 0.04 719440
#> 5 B 565000 2009 0.07 0.04 0.04 0.03 719440
显然,出现此错误的一种方法是权重变量也在 'by' 语句中。我尝试了两个不同的权重变量,都是双倍的,但只有一个给出了错误。