R 对范围内的每个值应用一个数字
因此,我有一个列,列中的值在一定的年份范围内(见下文)。我使用aggregate()获得了每个范围的平均值。但是,当我尝试对每个值应用这个平均数时,我得到了一个错误。例如,对于1900-1910范围内的每个值,我希望该范围的平均值显示在该行的“平均值”列下 我能得到的是:R 对范围内的每个值应用一个数字,r,R,因此,我有一个列,列中的值在一定的年份范围内(见下文)。我使用aggregate()获得了每个范围的平均值。但是,当我尝试对每个值应用这个平均数时,我得到了一个错误。例如,对于1900-1910范围内的每个值,我希望该范围的平均值显示在该行的“平均值”列下 我能得到的是: Range Avg 1900-1910 15.33 1911-1920 6.67 .... 1941-1950 22.00 想要: 我能够得到每个范围的平均值,但我无法找出如何将该范围的平均值应用于每个特
Range Avg
1900-1910 15.33
1911-1920 6.67
....
1941-1950 22.00
想要:
我能够得到每个范围的平均值,但我无法找出如何将该范围的平均值应用于每个特定值。我唯一能想到的就是一堆嵌套的ifelse()语句,但这似乎太乏味了。例如:
d$Avg<-ifelse(Range=="1900-1910",15.33,
ifelse(Range=="1911-1920",6.67,
...etc))
d$Avg解决方案是将聚合数据视为查找表,然后使用merge
获得所需的数据集
因此,如果聚合数据是lookupdf
,那么我们可以像这样使用merge
:
final_df <- merge(d, lookupdf, by=c("Range"))
解决方案是将聚合数据视为查找表,然后使用merge
获得所需的数据集
因此,如果聚合数据是lookupdf
,那么我们可以像这样使用merge
:
final_df <- merge(d, lookupdf, by=c("Range"))
我知道您明确表示希望避免嵌套的ifelse语句,所以请原谅我在这里使用了一个。但在我的辩护中,我们有一个解决方案,它基本上重用了相同的ifelse
,使用apply函数创建Range
和Avg
列。我们还可以使用dplyr
快速获取平均值
此解决方案还假设您只有值
和年
,因为我不确定您是如何到达您所在的位置的,例如,创建范围
列。所以我从零开始
首先编写一个函数来定义范围
列
library(dplyr)
get_range <- function(number){ #<-- takes in percentile
ans <-
if ( (number >= 1900) & ( number <= 1910) ) {
"1900-1910"
} else if ( (number > 1910 ) & ( number <= 1920) ) {
"1911-1920"
} else if ( (number > 1920 ) & ( number <= 1930) ) {
"1921-1930"
} else if ( (number > 1930 ) & ( number <= 1940) ) {
"1931-1940"
} else if ( (number > 1940 ) & ( number <= 1950) ) {
"1941-1950"
} else if ( (number > 1950 ) & ( number <= 1960) ) {
"1951-1960"
} else if ( (number > 1960 ) & ( number <= 1970) ) {
"1961-1970"
} else if ( (number > 1970 ) & ( number <= 1980) ) {
"1971-1980"
} else if ( (number > 1980 ) & ( number <= 1990) ) {
"1981-1990"
} else if ( (number > 1990 ) & ( number <= 2000) ) {
"1991-2000"
} else {
"NA"
}
return(ans)
}
修改上述相同的函数以处理平均值
get_avg <- function(number){
ans <-
if ( (number >= 1900) & ( number <= 1910) ) {
df_Avg$Avg[1]
} else if ( (number > 1910 ) & ( number <= 1920) ) {
df_Avg$Avg[2]
} else if ( (number > 1920 ) & ( number <= 1930) ) {
df_Avg$Avg[3]
} else if ( (number > 1930 ) & ( number <= 1940) ) {
df_Avg$Avg[4]
} else if ( (number > 1940 ) & ( number <= 1950) ) {
df_Avg$Avg[5]
} else if ( (number > 1950 ) & ( number <= 1960) ) {
df_Avg$Avg[6]
} else if ( (number > 1960 ) & ( number <= 1970) ) {
df_Avg$Avg[7]
} else if ( (number > 1970 ) & ( number <= 1980) ) {
df_Avg$Avg[8]
} else if ( (number > 1980 ) & ( number <= 1990) ) {
df_Avg$Avg[9]
} else if ( (number > 1990 ) & ( number <= 2000) ) {
df_Avg$Avg[1]
} else {
"NA"
}
return(ans)
}
我相信你可以用更少的代码更快地完成这项工作,但作为交换,这是相当可读的,你可以把它交给你的同事,而不必做大量的评论。我知道你明确表示希望避免嵌套的ifelse语句,所以请原谅我在这里使用它。但在我的辩护中,我们有一个解决方案,它基本上重用了相同的ifelse
,使用apply函数创建Range
和Avg
列。我们还可以使用dplyr
快速获取平均值
此解决方案还假设您只有值
和年
,因为我不确定您是如何到达您所在的位置的,例如,创建范围
列。所以我从零开始
首先编写一个函数来定义范围
列
library(dplyr)
get_range <- function(number){ #<-- takes in percentile
ans <-
if ( (number >= 1900) & ( number <= 1910) ) {
"1900-1910"
} else if ( (number > 1910 ) & ( number <= 1920) ) {
"1911-1920"
} else if ( (number > 1920 ) & ( number <= 1930) ) {
"1921-1930"
} else if ( (number > 1930 ) & ( number <= 1940) ) {
"1931-1940"
} else if ( (number > 1940 ) & ( number <= 1950) ) {
"1941-1950"
} else if ( (number > 1950 ) & ( number <= 1960) ) {
"1951-1960"
} else if ( (number > 1960 ) & ( number <= 1970) ) {
"1961-1970"
} else if ( (number > 1970 ) & ( number <= 1980) ) {
"1971-1980"
} else if ( (number > 1980 ) & ( number <= 1990) ) {
"1981-1990"
} else if ( (number > 1990 ) & ( number <= 2000) ) {
"1991-2000"
} else {
"NA"
}
return(ans)
}
修改上述相同的函数以处理平均值
get_avg <- function(number){
ans <-
if ( (number >= 1900) & ( number <= 1910) ) {
df_Avg$Avg[1]
} else if ( (number > 1910 ) & ( number <= 1920) ) {
df_Avg$Avg[2]
} else if ( (number > 1920 ) & ( number <= 1930) ) {
df_Avg$Avg[3]
} else if ( (number > 1930 ) & ( number <= 1940) ) {
df_Avg$Avg[4]
} else if ( (number > 1940 ) & ( number <= 1950) ) {
df_Avg$Avg[5]
} else if ( (number > 1950 ) & ( number <= 1960) ) {
df_Avg$Avg[6]
} else if ( (number > 1960 ) & ( number <= 1970) ) {
df_Avg$Avg[7]
} else if ( (number > 1970 ) & ( number <= 1980) ) {
df_Avg$Avg[8]
} else if ( (number > 1980 ) & ( number <= 1990) ) {
df_Avg$Avg[9]
} else if ( (number > 1990 ) & ( number <= 2000) ) {
df_Avg$Avg[1]
} else {
"NA"
}
return(ans)
}
我相信你可以用更少的代码更快地完成这项工作,但作为交换,这是相当可读的,你可以把它交给你的同事,而不必做大量的评论
df_Avg <- df %>%
group_by(Range) %>%
summarise(Avg = mean(Value))
get_avg <- function(number){
ans <-
if ( (number >= 1900) & ( number <= 1910) ) {
df_Avg$Avg[1]
} else if ( (number > 1910 ) & ( number <= 1920) ) {
df_Avg$Avg[2]
} else if ( (number > 1920 ) & ( number <= 1930) ) {
df_Avg$Avg[3]
} else if ( (number > 1930 ) & ( number <= 1940) ) {
df_Avg$Avg[4]
} else if ( (number > 1940 ) & ( number <= 1950) ) {
df_Avg$Avg[5]
} else if ( (number > 1950 ) & ( number <= 1960) ) {
df_Avg$Avg[6]
} else if ( (number > 1960 ) & ( number <= 1970) ) {
df_Avg$Avg[7]
} else if ( (number > 1970 ) & ( number <= 1980) ) {
df_Avg$Avg[8]
} else if ( (number > 1980 ) & ( number <= 1990) ) {
df_Avg$Avg[9]
} else if ( (number > 1990 ) & ( number <= 2000) ) {
df_Avg$Avg[1]
} else {
"NA"
}
return(ans)
}
df$Avg <- sapply(df$Year, function(x) get_avg(x))
> df
Value Year Range Avg
1 12 1906 1900-1910 15.333333
2 15 1909 1900-1910 15.333333
3 7 1911 1911-1920 6.666667
4 22 1950 1941-1950 12.500000
5 4 1917 1911-1920 6.666667
6 9 1917 1911-1920 6.666667
7 19 1902 1900-1910 15.333333
8 1 1921 1921-1930 1.000000
9 2 1931 1931-1940 2.000000
10 3 1941 1941-1950 12.500000
11 4 1951 1951-1960 4.000000
12 5 1961 1961-1970 5.000000
13 6 1971 1971-1980 6.000000
14 7 1981 1981-1990 7.000000
15 8 1991 1991-2000 15.333333