我试图使用tidyverse和modelr包计算一组数据的逻辑回归预测.显然我做错了,add_predictions因为我没有收到后勤功能的"响应",就像我在统计数据中使用'预测'功能一样.这应该很简单,但我无法弄清楚,多次搜索产生的结果很少.
library(tidyverse)
library(modelr)
options(na.action = na.warn)
library(ISLR)
d <- as_tibble(ISLR::Default)
model <- glm(default ~ balance, data = d, family = binomial)
grid <- d %>% data_grid(balance) %>% add_predictions(model)
ggplot(d, aes(x=balance)) +
geom_point(aes(y = default)) +
geom_line(data = grid, aes(y = pred))
Run Code Online (Sandbox Code Playgroud) 我发现有些表达式只能在大括号(大括号{ })中使用,例如:
library(dplyr)
3 %>% {3 + .}
3 %>% {ifelse(. < 2, TRUE, FALSE)}
Run Code Online (Sandbox Code Playgroud)
在管道时使用花括号的原则是什么?我们何时应该使用它以及使用哪些表达式?
有很多关于如何读取多个CSV并将它们绑定到一个数据帧的文档.我有5000多个CSV文件需要读入并绑定到一个数据结构中.
特别是我在这里的讨论:使用rbind将多个.csv文件加载到R中的单个数据帧中的问题
奇怪的是,基础R比我尝试过的任何其他解决方案都要快得多.
这是我的CSV的样子:
> head(PT)
Line Timestamp Lane.01 Lane.02 Lane.03 Lane.04 Lane.05 Lane.06 Lane.07 Lane.08
1 PL1 05-Jan-16 07:17:36 NA NA NA NA NA NA NA NA
2 PL1 05-Jan-16 07:22:38 NA NA NA NA NA NA NA NA
3 PL1 05-Jan-16 07:27:41 NA NA NA NA NA NA NA NA
4 PL1 05-Jan-16 07:32:43 9.98 10.36 10.41 10.16 10.10 9.97 10.07 9.59
5 PL1 05-Jan-16 07:37:45 9.65 8.87 9.88 9.86 8.85 8.75 9.19 8.51
6 PL1 05-Jan-16 …Run Code Online (Sandbox Code Playgroud) 我创建了一个简单的数据框(dput如下):
date ticker value
------------------------------
2016-06-30 A2M.ASX 0.0686
2016-07-29 A2M.ASX -0.0134
2016-08-31 A2M.ASX -0.0650
2016-09-30 A2M.ASX 0.0145
2016-10-31 A2M.ASX 0.3600
2016-11-30 A2M.ASX -0.1429
Run Code Online (Sandbox Code Playgroud)
我想将value列的名称更改为我的metric变量名称中的任何内容,我想以某种dplyr方式执行此操作.
我的样本数据:
df = structure(list(date = c("2016-06-30", "2016-07-29", "2016-08-31", "2016-09-30", "2016-10-31", "2016-11-30"), ticker = c("A2M.ASX", "A2M.ASX", "A2M.ASX", "A2M.ASX", "A2M.ASX", "A2M.ASX"), value = c(0.0686, -0.0134, -0.065, 0.0145, 0.36, -0.1429)), .Names = c("date", "ticker", "value"), row.names = c(NA, 6L), class = "data.frame")
metric = "next_return"
Run Code Online (Sandbox Code Playgroud)
我知道如何在一行中做到这一点:
colnames(df)[3] = metric
Run Code Online (Sandbox Code Playgroud)
但我想以某种tidyverse …
当我在dplyr中使用group_by和summary时,我可以自然地将不同的汇总函数应用于不同的变量.例如:
library(tidyverse)
df <- tribble(
~category, ~x, ~y, ~z,
#----------------------
'a', 4, 6, 8,
'a', 7, 3, 0,
'a', 7, 9, 0,
'b', 2, 8, 8,
'b', 5, 1, 8,
'b', 8, 0, 1,
'c', 2, 1, 1,
'c', 3, 8, 0,
'c', 1, 9, 1
)
df %>% group_by(category) %>% summarize(
x=mean(x),
y=median(y),
z=first(z)
)
Run Code Online (Sandbox Code Playgroud)
结果输出:
# A tibble: 3 x 4
category x y z
<chr> <dbl> <dbl> <dbl>
1 a 6 6 8
2 b 5 1 …Run Code Online (Sandbox Code Playgroud) 考虑data.frame上的标准分组操作:
library(plyr)
library(doMC)
library(MASS) # for example
nc <- 12
registerDoMC(nc)
d <- data.frame(x = c("data", "more data"), g = c("group1", "group2"))
y <- "some global object"
res <- ddply(d, .(g), function(d_group) {
# slow, complicated operations on d_group
}, .parallel = FALSE)
Run Code Online (Sandbox Code Playgroud)
通过简单地编写.parallel = TRUE来利用多核设置是微不足道的.这是我最喜欢的plyr功能之一.
但是,随着plyr被弃用(我认为)并且基本上被dplyr,purrr等取代,并行处理的解决方案变得更加冗长:
library(dplyr)
library(multidplyr)
library(parallel)
library(MASS) # for example
nc <- 12
d <- tibble(x = c("data", "more data"), g = c("group1", "group2"))
y <- "some global object"
cl <- create_cluster(nc)
set_default_cluster(cl)
cluster_library(cl, …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到重叠的间隔,并决定将间隔数据加入到自身中,dplyr::left_join()以便我可以将间隔与lubridate::int_overlaps()每个其他间隔进行比较.
这是我期望left_join()的表现方式.两个tibbles具有三行交叉以形成tibble与9行:
library(tidyverse)
tibble(a = rep("a", 3), b = rep(1, 3)) %>%
left_join(tibble(a = rep("a", 3), c = rep(2, 3)))
Joining, by = "a"
# A tibble: 9 x 3
a b c
<chr> <dbl> <dbl>
1 a 1 2
2 a 1 2
3 a 1 2
4 a 1 2
5 a 1 2
6 a 1 2
7 a 1 2
8 a 1 2
9 a 1 2 …Run Code Online (Sandbox Code Playgroud) tidyr::unnestR 语言中的方法与 Pandas 中的等效方法相同explode,如此非常详细的答案中所述。我想知道是否有等效于 ?tidyr::nest` 的方法。
示例 R 代码:
library(tidyr)
iris_nested <- as_tibble(iris) %>% nest(data=-Species)
Run Code Online (Sandbox Code Playgroud)
数据列是一个列表列,其中包含数据框(这对于建模非常有用,例如在运行多个模型时)。
iris_nested
# A tibble: 3 x 2
Species data
<fct> <list<df[,4]>>
1 setosa [50 × 4]
2 versicolor [50 × 4]
3 virginica [50 × 4]
Run Code Online (Sandbox Code Playgroud)
要访问数据列中的一个元素:
iris_nested[1,'data'][[1]]
[...]
# A tibble: 50 x 4
Sepal.Length Sepal.Width Petal.Length Petal.Width
<dbl> <dbl> <dbl> <dbl>
1 5.1 3.5 1.4 0.2
2 4.9 3 1.4 0.2
3 4.7 3.2 1.3 0.2
4 …Run Code Online (Sandbox Code Playgroud) 假设我有数据test(给定的 dput),其中 list-col 说items:
test <- structure(list(items = list('a', c('b', 'c'), c('d', 'e'), 'f', c('g', 'h')),
ID = c(1,1,1,2,2)), row.names = c(NA, 5L), class = "data.frame")
library(tidyverse)
test %>% group_by(ID) %>%
mutate(dummy = accumulate(items, ~paste(.x, .y)))
Run Code Online (Sandbox Code Playgroud)
我得到一个像这样的 list-col 输出
items ID dummy
1 a 1 a
2 b, c 1 a b, a c
3 d, e 1 a b d, a c e
4 f 2 f
5 g, h 2 f g, f h …Run Code Online (Sandbox Code Playgroud) 我从混合tidyverse和data.table语法中得到了一些非常奇怪的行为。对于上下文,我经常发现自己使用tidyverse语法,然后data.table在需要速度与需要代码可读性时添加管道。我知道 Hadley 正在开发一个快速使用tidyverse语法的新包data.table,但据我所知,它仍处于初期阶段,所以我还没有使用它。
有人愿意解释这里发生了什么吗?这对我来说非常可怕,因为我可能不假思索地做了数千次。
library(dplyr); library(data.table)
DT <-
fread(
"iso3c country income
MOZ Mozambique LIC
ZMB Zambia LMIC
ALB Albania UMIC
MOZ Mozambique LIC
ZMB Zambia LMIC
ALB Albania UMIC
"
)
codes <- c("ALB", "ZMB")
# now, what happens if I use a tidyverse function (distinct) and then
# convert back to data.table?
DT <- distinct(DT) %>% as.data.table()
# this works like normal
DT[iso3c %in% codes]
# …Run Code Online (Sandbox Code Playgroud)