我正在测试该parLapplyLB()功能,以了解它如何平衡负载.但我没有看到任何平衡发生.例如,
cl <- parallel::makeCluster(2)
system.time(
parallel::parLapplyLB(cl, 1:4, function(y) {
if (y == 1) {
Sys.sleep(3)
} else {
Sys.sleep(0.5)
}}))
## user system elapsed
## 0.004 0.009 3.511
parallel::stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)
如果它真正平衡了负载,则休眠3秒的第一个作业(作业1)将在第一个节点上,而其他三个作业(作业2:4)将在另一个节点上休眠总共1.5秒.总的来说,系统时间应该只有3秒.
相反,我认为作业1和2被赋予节点1,作业3和4被赋予节点2.这导致总时间为3 + 0.5 = 3.5秒.如果我们运行相同的代码parLapply()代替parLapplyLB(),我们得到相同的系统时间约3.5秒.
我不理解或做错了什么?
我有一个数据框,需要分成两个表来满足Codd的第三范式.在一个简单的例子中,原始数据框看起来像这样:
library(lubridate)
> (df <- data.frame(hh_id = 1:2,
income = c(55000, 94000),
bday_01 = ymd(c(20150309, 19890211)),
bday_02 = ymd(c(19850911, 20000815)),
gender_01 = factor(c("M", "F")),
gender_02 = factor(c("F", "F"))))
hh_id income bday_01 bday_02 gender_01 gender_02
1 1 55000 2015-03-09 1985-09-11 M F
2 2 94000 1989-02-11 2000-08-15 F F
Run Code Online (Sandbox Code Playgroud)
当我使用聚集函数时,它会警告属性不相同,并且会丢失性别因素和bday的润滑(或实际示例中的其他属性).是否有一个很好的tidyr解决方案,以避免丢失每列的数据类型?
library(tidyr)
> (person <- df %>%
select(hh_id, bday_01:gender_02) %>%
gather(key, value, -hh_id) %>%
separate(key, c("key", "per_num"), sep = "_") %>%
spread(key, value))
hh_id per_num bday gender
1 1 01 1425859200 M …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的数据帧:
library(dplyr)
data <- data_frame(
timestamp_utc = c('2015-11-18 03:55:04', '2015-11-18 03:55:08',
'2015-11-18 03:55:10'),
local_tz = c('America/New_York', 'America/Los_Angeles',
'America/Indiana/Indianapolis')
)
Run Code Online (Sandbox Code Playgroud)
我需要创建一个新的变量,将UTC时间戳转换为local_tz列中定义的本地时间.然而,两者format和with_tz(来自lubridate)只期望一个时区,而不是时区矢量.我正在寻找这样的东西:
mutate(data, timestamp_local = with_tz(timestamp_utc, tzone = local_tz))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?