我有一个有效的解决方案,但我正在寻找一个更清晰,更易读的解决方案,可能会利用一些较新的dplyr窗口函数.
使用mtcars数据集,如果我想查看第25,第50,第75百分位数以及每加仑英里数("mpg")和气缸数("cyl"),我使用以下代码:
library(dplyr)
library(tidyr)
# load data
data("mtcars")
# Percentiles used in calculation
p <- c(.25,.5,.75)
# old dplyr solution
mtcars %>% group_by(cyl) %>%
do(data.frame(p=p, stats=quantile(.$mpg, probs=p),
n = length(.$mpg), avg = mean(.$mpg))) %>%
spread(p, stats) %>%
select(1, 4:6, 3, 2)
# note: the select and spread statements are just to get the data into
# the format in which I'd like to see it, but are not critical
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用dplyr使用一些汇总函数(n_tiles,percent_rank等)更干净地完成这项工作?干净利落,我的意思是没有"做"声明.
谢谢
我有以下数据:
Name <- c("Sam", "Sarah", "Jim", "Fred", "James", "Sally", "Andrew", "John", "Mairin", "Kate", "Sasha", "Ray", "Ed")
Age <- c(22,12,31,35,58,82,17,34,12,24,44,67,43)
Group <- c("A", "B", "B", "B", "B", "C", "C", "D", "D", "D", "D", "D", "D")
data <- data.frame(Name, Age, Group)
Run Code Online (Sandbox Code Playgroud)
我想用dplyr来
(1)按"组"分组数据(2)显示每组内的最小和最大年龄(3)显示最小和最大年龄的人的姓名
以下代码执行此操作:
data %>% group_by(Group) %>%
summarize(minAge = min(Age), minAgeName = Name[which(Age == min(Age))],
maxAge = max(Age), maxAgeName = Name[which(Age == max(Age))])
Run Code Online (Sandbox Code Playgroud)
哪个效果很好:
Group minAge minAgeName maxAge maxAgeName
1 A 22 Sam 22 Sam
2 B 12 Sarah 58 James …Run Code Online (Sandbox Code Playgroud) 我在 Jupyter 笔记本(不是 JupyterLab)中使用以下方法渲染 Altair 图:
alt.renderers.enable('notebook')
Run Code Online (Sandbox Code Playgroud)
一切正常,但是相对于我的 Jupyter 笔记本的宽度,这些图通常很小。
如果我使用以下方法将笔记本的宽度扩展到屏幕的 100%:
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
Run Code Online (Sandbox Code Playgroud)
Altair 图不会相应地缩放(它们保持相同的大小)。
有什么方法可以缩放渲染图的大小(即,使它们更大),同时仍将它们保留在笔记本中?
谢谢!
我有兴趣获取data.frame的列,其中列中的值是管道分隔的,并从管道分隔的值创建虚拟变量.
例如:
让我们说我们开始吧
df = data.frame(a = c("Ben|Chris|Jim", "Ben|Greg|Jim|", "Jim|Steve|Ben"))
> df
a
1 Ben|Chris|Jim
2 Ben|Greg|Jim
3 Jim|Steve|Ben
Run Code Online (Sandbox Code Playgroud)
我有兴趣最终得到:
df2 = data.frame(Ben = c(1, 1, 1), Chris = c(1, 0, 0), Jim = c(1, 1, 1), Greg = c(0, 1, 0),
Steve = c(0, 0, 1))
> df2
Ben Chris Jim Greg Steve
1 1 1 1 0 0
2 1 0 1 1 0
3 1 0 1 0 1
Run Code Online (Sandbox Code Playgroud)
我事先并不知道该领域有多少潜在价值.在上面的示例中,变量"a"可以包括1个值或10个值.假设它是一个合理的数字(即<100个可能的值).
有什么好办法吗?
我正在使用dplyr将一些数据简单地分成训练和测试.
当我做一个简单的例子时,它很有效:
a = c(1, 2, 3, 4, 5, 6, 7, 8)
b = c("A", "B", "C", "D", "E", "F", "G", "H")
df = data.frame(a, b)
train = sample_frac(df, 0.8)
test = setdiff(df, train)
> nrow(train) + nrow(test) == nrow(df)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用经典的UCI Wine数据集做同样的事情时,我似乎没有得到相同的结果:
wine = read.csv("http://www.nd.edu/~mclark19/learn/data/goodwine.csv")
wine_train = sample_frac(wine, 0.8)
wine_test = setdiff(wine, wine_train)
> nrow(wine_train) + nrow(wine_test) == nrow(wine)
[1] FALSE
> nrow(wine_train) + nrow(wine_test)
[1] 6105
> nrow(wine)
[1] 6497
Run Code Online (Sandbox Code Playgroud)
有什么关于setdiff的行为,我错过了吗?
谢谢,AG
有没有办法在dplyr链中将summarize_all和summaryrize语句组合在一起?像这样的东西:
library(dplyr)
data(mtcars)
mtcars %>%
group_by(cyl) %>%
summarize_all(funs(mean(., na.rm=TRUE))) %>%
summarize(n = n())
Run Code Online (Sandbox Code Playgroud)
但当然这不起作用,因为它试图总结一个总结.
预期结果是单个data.frame由cyl分组,每列按平均值汇总,以及由cyl观察的计数.我可以通过使用bind_cols组合两个单独的摘要语句来做到这一点,但有更好的方法吗?
谢谢