Re: [問題] dplyr 與 mutate用法

作者: celestialgod (天)   2016-10-13 19:55:30
※ 引述《huangsam (sam)》之銘言:
: [問題類型]:
:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
:
: [軟體熟悉度]:
: 請把以下不需要的部份刪除
: 入門(寫過其他程式,只是對語法不熟悉)
:
: [問題敘述]:
: 請簡略描述你所要做的事情,或是這個程式的目的
: 想要用dplyr中的mutate 搭配迴圈使用或是大家有更好的想法
: 下方並無法將column1....改變只會產生新的欄位i
: [程式範例]:
:
: 想要用dplyr中的mutate做迴圈舉例如下
: x <- c("column1","column2", "column3",....)
: 總共可能有100個欄位其中有10個欄位是時間格式,目前我是用
: data %>% mutate(column1 = as.POSIXct....
: column2 = as.POSIXct....
: .
: .
: column10 = as.POSIXct...)
: for (i in x)
: {
: data %>% mutate( i = as.POSIXct(as.numeric(i)*(60*60*24), origin="1899-12-30"
: , tz="UCT") )
: }
:
: [環境敘述]:
:
:
: [關鍵字]:
:
: dplyr , mutate
:
好讀版:http://pastebin.com/vQbFHfxm
library(dplyr)
minDate <- as.POSIXct("1990-01-01")
N <- 1000
p <- 100
dat <- lapply(1:p, function(x) {
if (x > p*0.1){
rnorm(N)
} else {
as.integer(Sys.time()) - sample(2e8, N)
}
}) %>% `names<-`(paste0("V", 1:p)) %>% as_data_frame
possibleTimeCols <- sapply(dat[1, ], function(x){
as.POSIXct(x, origin = "1970-01-01", tz = "Asia/Taipei") >= minDate
}) %>% {names(.)[.]}
datOut <- dat %>% mutate_each_(funs(as.POSIXct(., origin = "1970-01-01",
tz = "Asia/Taipei")), vars = possibleTimeCols)
print(datOut)
# Source: local data frame [1,000 x 100]
#
# V1 V2 V3
# <time> <time> <time>
# 1 2011-12-15 20:55:45 2012-04-18 23:16:08 2012-10-13 13:38:58
# 2 2013-03-15 11:05:22 2013-07-28 18:11:49 2011-03-26 14:46:51
# 3 2015-03-03 13:54:22 2011-06-18 05:31:24 2012-03-26 14:53:00
# 4 2015-11-03 01:30:12 2011-11-02 01:21:49 2013-11-05 15:16:48
# 5 2012-11-18 12:06:22 2012-04-05 16:28:43 2010-09-12 14:24:42
# 6 2012-01-24 03:38:18 2014-11-09 11:54:44 2016-05-30 21:50:26
# 7 2010-08-03 22:27:15 2016-01-04 00:05:41 2014-02-16 00:53:00
# 8 2013-05-14 12:44:14 2011-12-24 22:13:11 2012-01-17 18:22:01
# 9 2011-05-14 16:28:25 2011-04-23 07:36:51 2011-05-01 04:31:10
# 10 2010-07-02 17:25:18 2010-08-26 05:15:27 2013-12-31 21:10:19
# data.table解法
library(data.table)
library(pipeR)
minDate <- as.POSIXct("1990-01-01")
N <- 1000
p <- 100
dat <- lapply(1:p, function(x) {
if (x > p*0.1){
rnorm(N)
} else {
as.integer(Sys.time()) - sample(2e8, N)
}
}) %>>% as.data.table
possibleTimeCols <- sapply(dat[1, ], function(x){
as.POSIXct(x, origin = "1970-01-01", tz = "Asia/Taipei") >= minDate
}) %>>% (names(.)[.])
dateDT <- dat[ , lapply(.SD, function(x) as.POSIXct(x, origin = "1970-01-01",
tz = "Asia/Taipei")) ,
.SDcols = possibleTimeCols]
dat[ , `:=`(eval(possibleTimeCols), dateDT)] %>>% print
# V1 V2 V3
# 1: 2014-04-29 22:17:22 2013-07-12 11:37:04 2013-12-19 13:01:16
# 2: 2010-11-15 19:23:53 2016-01-28 05:17:19 2013-06-16 15:04:38
# 3: 2013-04-14 18:16:29 2012-10-25 07:32:09 2012-09-30 05:00:31
# 4: 2010-10-19 02:10:24 2015-04-02 19:09:34 2012-09-11 20:30:54
# 5: 2012-09-10 02:39:22 2014-05-18 23:02:04 2015-11-19 21:44:06
#
作者: huangsam (sam)   2016-10-13 22:35:00
這個有點難,但是寫出來好強大!謝謝提供,有沒有類似文章可以讀'names <-'的用法

Links booklink

Contact Us: admin [ a t ] ucptt.com