给出两个数据框:
df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))
df1
# CustomerId Product
# 1 Toaster
# 2 Toaster
# 3 Toaster
# 4 Radio
# 5 Radio
# 6 Radio
df2
# CustomerId State
# 2 Alabama
# 4 Alabama
# 6 Ohio
Run Code Online (Sandbox Code Playgroud)
我怎样才能做数据库风格,即sql风格,加入?也就是说,我该怎么做:
我想估计大约2250万个观测数据集的滚动风险值,因此我想使用sparklyr进行快速计算.这是我做的(使用示例数据库):
library(PerformanceAnalytics)
library(reshape2)
library(dplyr)
data(managers)
data <- zerofill(managers)
data<-as.data.frame(data)
class(data)
data$date=row.names(data)
lmanagers<-melt(data, id.vars=c('date'))
Run Code Online (Sandbox Code Playgroud)
现在我估计使用dplyr和PerformanceAnalytics包的VaR:
library(zoo) # for rollapply()
var <- lmanagers %>% group_by(variable) %>% arrange(variable,date) %>%
mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T))
Run Code Online (Sandbox Code Playgroud)
这很好用.现在我这样做是为了使用sparklyr:
library(sparklyr)
sc <- spark_connect(master = "local")
lmanagers_sp <- copy_to(sc,lmanagers)
src_tbls(sc)
var_sp <- lmanagers_sp %>% group_by(variable) %>% arrange(variable,date) %>%
mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) %>%
collect
Run Code Online (Sandbox Code Playgroud)
但是这会产生以下错误:
Error: Unknown input type: pairlist
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我哪里出错,什么是正确的代码?或者任何其他更快地估算滚动VaR的解决方案也是值得赞赏的.
我环顾四周,找不到一个简单的答案。我该如何做 SQL 中的更新表?例如:
> df1 = data.frame(id=seq(1:3), v1=c("a", "b", NA))
> df1
id v1
1 1 a
2 2 b
3 3 <NA>
> df2 = data.frame(id=seq(1:3), v2=c("z", "y", "c"))
> df2
id v2
1 1 z
2 2 y
3 3 c
Run Code Online (Sandbox Code Playgroud)
如何使用 v1 中 v2 的值更新 df1,但仅当 id 匹配且 id > 2 时?我查看了 data.table,但无法弄清楚 := 语法,并希望基本 R 中有一些简单的东西?期望的输出是:
> df1
id v1
1 1 a
2 2 b
3 3 c
Run Code Online (Sandbox Code Playgroud) 使用查找表中的(正确)值更新/替换主数据集中的NA的最有效方法是什么?这是一个如此常见的操作!类似的问题似乎没有整洁的解决方案.
约束:1)请假设大量缺失值和更大的查找表比给出的示例.所以情况下明智的替换操作将是不切实际的(不case_when,if_else等等)
2)查找表没有主数据帧的所有值,只有替换的值.
Tidyverse解决方案的答案更受欢迎.类似的问题似乎没有整洁的解决方案.
library(tidyverse)
### Main Dataframe ###
df1 <- tibble(
state_abbrev = state.abb[1:10],
state_name = c(state.name[1:5], rep(NA, 3), state.name[9:10]),
value = sample(500:1200, 10, replace=TRUE)
)
#> # A tibble: 10 x 3
#> state_abbrev state_name value
#> <chr> <chr> <int>
#> 1 AL Alabama 551
#> 2 AK Alaska 765
#> 3 AZ Arizona 508
#> 4 AR Arkansas 756
#> 5 CA California 741
#> 6 CO <NA> 1100
#> 7 CT <NA> …Run Code Online (Sandbox Code Playgroud)