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