如何在 R 中将年份映射到随后的几十年?
How to map years into subsequent decades in R?
我有一个从 1920 年到 2020 年的年份列表。我需要将它们转换为随后的几十年。
我如何在 R 中毫不费力地做到这一点?
我正在尝试编写嵌套的 if 语句,但它变得太长和乏味了。
我的数据样本:
data <-structure(list(Years = c(1945L, 1987L, 1980L, 1963L, 2006L, 1995L,
1971L)), class = "data.frame", row.names = c(NA, -7L))
期望的输出:
任何帮助都意义重大!
data %>%
mutate(Decade = if_else(Years >= 2000,
paste0(Years %/% 10 * 10, "'s"),
paste0((Years - 1900) %/% 10 * 10, "'s")))
%/% 10 * 10
位在这里完成了繁重的工作。 %/%
是“整数除法”运算符,它标识十年的整数,然后我们乘以 10 得到年数。
Years Decade
1 1945 40's
2 1987 80's
3 1980 80's
4 1963 60's
5 2006 2000's
6 1995 90's
7 1971 70's
这将为您提供所需的结果,如果您不使用 ifelse,您将获得 1940 年代、1950 年代等。
data %>%
mutate(Decade = paste0(floor(ifelse(Years<2000, Years-1900, Years)/10)*10, "'s"))
我们可以使用一个函数 - getDecade 来整理。
getDecade <- function(year) {
year <- ifelse(year<2000, year-1900, year)
decade <- floor(year/10) * 10
return (decade)
}
data %>% mutate(decade = paste0(getDecade(Years),"'s"))
或者也许使用子字符串..意味着您不必考虑那么多:
(此外,压缩代码并不总是更好的代码)
decade <- function( year ) {
decades <- year
i1 <- year < 2000
## first the 19.. decades
decades[ i1 ] <- paste0( substr( year[ i1 ], 3, 3 ), "0's" )
## then the 20.. decades
decades[ !i1 ] <- paste0( substr( year[ !i1 ], 1, 3 ), "0's" )
return( decades )
}
data$Decade <- decade( data$Year )
使用 data.table
的替代方法
library(data.table)
setDT(data) #converting data into data.table
data[,decade:=paste0(floor(as.numeric(substr(Years,3,4))/10), "0's")]
data[decade=="00's", decade:="2000's"]
data
Years decade
1: 1945 40's
2: 1987 80's
3: 1980 80's
4: 1963 60's
5: 2006 2000's
6: 1995 90's
7: 1971 70's
我有一个从 1920 年到 2020 年的年份列表。我需要将它们转换为随后的几十年。 我如何在 R 中毫不费力地做到这一点? 我正在尝试编写嵌套的 if 语句,但它变得太长和乏味了。
我的数据样本:
data <-structure(list(Years = c(1945L, 1987L, 1980L, 1963L, 2006L, 1995L,
1971L)), class = "data.frame", row.names = c(NA, -7L))
期望的输出:
任何帮助都意义重大!
data %>%
mutate(Decade = if_else(Years >= 2000,
paste0(Years %/% 10 * 10, "'s"),
paste0((Years - 1900) %/% 10 * 10, "'s")))
%/% 10 * 10
位在这里完成了繁重的工作。 %/%
是“整数除法”运算符,它标识十年的整数,然后我们乘以 10 得到年数。
Years Decade
1 1945 40's
2 1987 80's
3 1980 80's
4 1963 60's
5 2006 2000's
6 1995 90's
7 1971 70's
这将为您提供所需的结果,如果您不使用 ifelse,您将获得 1940 年代、1950 年代等。
data %>%
mutate(Decade = paste0(floor(ifelse(Years<2000, Years-1900, Years)/10)*10, "'s"))
我们可以使用一个函数 - getDecade 来整理。
getDecade <- function(year) {
year <- ifelse(year<2000, year-1900, year)
decade <- floor(year/10) * 10
return (decade)
}
data %>% mutate(decade = paste0(getDecade(Years),"'s"))
或者也许使用子字符串..意味着您不必考虑那么多:
(此外,压缩代码并不总是更好的代码)
decade <- function( year ) {
decades <- year
i1 <- year < 2000
## first the 19.. decades
decades[ i1 ] <- paste0( substr( year[ i1 ], 3, 3 ), "0's" )
## then the 20.. decades
decades[ !i1 ] <- paste0( substr( year[ !i1 ], 1, 3 ), "0's" )
return( decades )
}
data$Decade <- decade( data$Year )
使用 data.table
library(data.table)
setDT(data) #converting data into data.table
data[,decade:=paste0(floor(as.numeric(substr(Years,3,4))/10), "0's")]
data[decade=="00's", decade:="2000's"]
data
Years decade
1: 1945 40's
2: 1987 80's
3: 1980 80's
4: 1963 60's
5: 2006 2000's
6: 1995 90's
7: 1971 70's