难道ifelse真的同时计算yes和no载体-如,每个向量的全部?或者它只是从每个向量计算一些值?
还有,ifelse真的那么慢吗?
我面临着计算出生日期和任意日期的年龄(年,月或周)的共同任务.事情是,我经常需要在许多记录(> 3亿)上执行此操作,因此性能是一个关键问题.
在SO和Google中快速搜索后,我找到了3个替代方案:
所以,这是我的玩具代码:
# Some toy birthdates
birthdate <- as.Date(c("1978-12-30", "1978-12-31", "1979-01-01",
"1962-12-30", "1962-12-31", "1963-01-01",
"2000-06-16", "2000-06-17", "2000-06-18",
"2007-03-18", "2007-03-19", "2007-03-20",
"1968-02-29", "1968-02-29", "1968-02-29"))
# Given dates to calculate the age
givendate <- as.Date(c("2015-12-31", "2015-12-31", "2015-12-31",
"2015-12-31", "2015-12-31", "2015-12-31",
"2050-06-17", "2050-06-17", "2050-06-17",
"2008-03-19", "2008-03-19", "2008-03-19",
"2015-02-28", "2015-03-01", "2015-03-02"))
# Using a common arithmetic procedure ("Time differences in …Run Code Online (Sandbox Code Playgroud) 我是第一次使用data.table.
我的桌子上有一个大约400,000年的专栏.我需要将它们从出生日期转换为年龄.
做这个的最好方式是什么?
关于如何将列移动到第一个或最后一个位置有很多问题和答案.
使用dplyr最佳答案分别类似于:
iris2 <- iris %>% head(2)
iris2 %>% select( Sepal.Width, everything()) # move Sepal.Width to first
# Sepal.Width Sepal.Length Petal.Length Petal.Width Species
# 1 3.5 5.1 1.4 0.2 setosa
# 2 3.0 4.9 1.4 0.2 setosa
iris2 %>% select(-Sepal.Width, Sepal.Width) # move Sepal.Width to last
# Sepal.Length Petal.Length Petal.Width Species Sepal.Width
# 1 5.1 1.4 0.2 setosa 3.5
# 2 4.9 1.4 0.2 setosa 3.0
Run Code Online (Sandbox Code Playgroud)
但是,我没有找到任何简单的方法在给定的一个之后或之前移动一个列.
我在下面发布了一个粗略的解决方案但是:
dplyr函数的灵活性来使用数字索引,名称,字符串等......我相信使用dplyr我们也可以移动列的列表,或者在名称等中显示模式的一组列...但我对dplyr样式编程还不是很熟悉.
所以我挑战你做得更好/更聪明,或者指出我错过的明显解决方案. …
我想根据出生日期计算年龄.
如果我使用lubridate,我会按照R给定出生日期和任意日期的有效和准确的年龄计算(年,月或周)运行以下内容
as.period(new_interval(start = birthdate, end = givendate))$year
但是,当我尝试使用mutatein dplyr来创建新变量时,我遇到了一个错误.
library(dplyr); library(lubridate)
birthdate <- ymd(c(NA, "1978-12-31", "1979-01-01", "1962-12-30"))
givendate <- ymd(c(NA, "2015-12-31", "2015-12-31", NA))
df <- data.frame(
birthdate = birthdate,
givendate = givendate)
Run Code Online (Sandbox Code Playgroud)
以下工作虽然它给出了所有日期和时间值.即年,月,日,小时,分钟和秒.
df<-df %>% mutate(age=as.period(interval(start = birthdate, end = givendate)))
# df
# birthdate givendate age
# 1 <NA> <NA> <NA>
# 2 1978-12-31 2015-12-31 37y 0m 0d 0H 0M 0S
# 3 1979-01-01 2015-12-31 36y 11m 30d 0H 0M 0S
# 4 …Run Code Online (Sandbox Code Playgroud)