Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对范围内的每个值应用一个数字_R - Fatal编程技术网

R 对范围内的每个值应用一个数字

R 对范围内的每个值应用一个数字,r,R,因此,我有一个列,列中的值在一定的年份范围内(见下文)。我使用aggregate()获得了每个范围的平均值。但是,当我尝试对每个值应用这个平均数时,我得到了一个错误。例如,对于1900-1910范围内的每个值,我希望该范围的平均值显示在该行的“平均值”列下 我能得到的是: Range Avg 1900-1910 15.33 1911-1920 6.67 .... 1941-1950 22.00 想要: 我能够得到每个范围的平均值,但我无法找出如何将该范围的平均值应用于每个特

因此,我有一个列,列中的值在一定的年份范围内(见下文)。我使用aggregate()获得了每个范围的平均值。但是,当我尝试对每个值应用这个平均数时,我得到了一个错误。例如,对于1900-1910范围内的每个值,我希望该范围的平均值显示在该行的“平均值”列下

我能得到的是:

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