簡體   English   中英

有沒有辦法用一行代碼來改變和創建許多新變量?

[英]Is there a way to mutate and create many new variables with one line of code?

我有類似的東西:

df<-data.frame(group=c(1, 1, 1, 1,1,2, 2, 2, 2), 
               date=c("2000-01-01 11:00:00", "2000-01-03 11:00:00", "2000-01-04 11:20:00", "2000-01-04 14:20:00", "2000-01-05 11:40:00", "2000-01-09 12:20:00", "2000-01-09 13:20:00", "2000-01-10 12:20:00", "2000-01-12 16:20:00"))
  group                date
1     1 2000-01-01 11:00:00
2     1 2000-01-03 11:00:00
3     1 2000-01-04 11:20:00
4     1 2000-01-04 14:20:00
5     1 2000-01-05 11:40:00
6     2 2000-01-09 12:20:00
7     2 2000-01-09 13:20:00
8     2 2000-01-10 12:20:00
9     2 2000-01-12 16:20:00

我想制作許多列指示日期后 24 小時、48 小時等(例如):

df%>%mutate(first=date+86400, second=date+172800, third=date+259200) 

等等等等,我在幾秒鍾內添加一天,但這非常耗時(如果我想要數百列)。 我假設有一種方法可以迭代地執行此操作。

謝謝,

如果我們可以使用english包,則可以生成列名,而使用lapply生成值

library(english)
df$date <- as.POSIXct(df$date)
df[as.character(ordinal(1:3))] <- lapply(1:3, function(x) df$date + 86400 * x)

它可以在循環中使用as.POSIXct轉換在一行代碼中完成,但我們將不必要地多次進行轉換(並非所有單行代碼都是有效的)


或者帶着purrr

library(purrr)
library(dplyr)
map_dfc(1:3, ~ tibble(!! as.character(ordinal(.x)) := df$date + 86400 * .x)) %>%
   bind_cols(df, .)
# group                date               first              second               third
#1     1 2000-01-01 11:00:00 2000-01-02 11:00:00 2000-01-03 11:00:00 2000-01-04 11:00:00
#2     1 2000-01-03 11:00:00 2000-01-04 11:00:00 2000-01-05 11:00:00 2000-01-06 11:00:00
#3     1 2000-01-04 11:20:00 2000-01-05 11:20:00 2000-01-06 11:20:00 2000-01-07 11:20:00
#4     1 2000-01-04 14:20:00 2000-01-05 14:20:00 2000-01-06 14:20:00 2000-01-07 14:20:00
#5     1 2000-01-05 11:40:00 2000-01-06 11:40:00 2000-01-07 11:40:00 2000-01-08 11:40:00
#6     2 2000-01-09 12:20:00 2000-01-10 12:20:00 2000-01-11 12:20:00 2000-01-12 12:20:00
#7     2 2000-01-09 13:20:00 2000-01-10 13:20:00 2000-01-11 13:20:00 2000-01-12 13:20:00
#8     2 2000-01-10 12:20:00 2000-01-11 12:20:00 2000-01-12 12:20:00 2000-01-13 12:20:00
#9     2 2000-01-12 16:20:00 2000-01-13 16:20:00 2000-01-14 16:20:00 2000-01-15 16:20:00

涉及dplyrpurrr另一種可能性可能是:

map(86400*1:3, ~ df %>%
     transmute(!!paste(.x/3600, "hours", sep = "_") := as.POSIXct(date) + .x)) %>%
 bind_cols(df, .)

  group                date            24_hours            48_hours            72_hours
1     1 2000-01-01 11:00:00 2000-01-02 11:00:00 2000-01-03 11:00:00 2000-01-04 11:00:00
2     1 2000-01-03 11:00:00 2000-01-04 11:00:00 2000-01-05 11:00:00 2000-01-06 11:00:00
3     1 2000-01-04 11:20:00 2000-01-05 11:20:00 2000-01-06 11:20:00 2000-01-07 11:20:00
4     1 2000-01-04 14:20:00 2000-01-05 14:20:00 2000-01-06 14:20:00 2000-01-07 14:20:00
5     1 2000-01-05 11:40:00 2000-01-06 11:40:00 2000-01-07 11:40:00 2000-01-08 11:40:00
6     2 2000-01-09 12:20:00 2000-01-10 12:20:00 2000-01-11 12:20:00 2000-01-12 12:20:00
7     2 2000-01-09 13:20:00 2000-01-10 13:20:00 2000-01-11 13:20:00 2000-01-12 13:20:00
8     2 2000-01-10 12:20:00 2000-01-11 12:20:00 2000-01-12 12:20:00 2000-01-13 12:20:00
9     2 2000-01-12 16:20:00 2000-01-13 16:20:00 2000-01-14 16:20:00 2000-01-15 16:20:00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM