小编dre*_*ww2的帖子

使用dplyr窗口函数计算百分位数

我有一个有效的解决方案,但我正在寻找一个更清晰,更易读的解决方案,可能会利用一些较新的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等)更干净地完成这项工作?干净利落,我的意思是没有"做"声明.

谢谢

r dplyr tidyr

47
推荐指数
6
解决办法
4万
查看次数

如何使用Dplyr的Summarize和which()来查找最小/最大值

我有以下数据:

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)

r dplyr

18
推荐指数
2
解决办法
3万
查看次数

在 Jupyter Notebook 中更改 Altair 绘图的大小

我在 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 图不会相应地缩放(它们保持相同的大小)。

有什么方法可以缩放渲染图的大小(即,使它们更大),同时仍将它们保留在笔记本中?

谢谢!

python altair

9
推荐指数
1
解决办法
5656
查看次数

将带有管道分隔数据的列转换为虚拟变量

我有兴趣获取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个可能的值).

有什么好办法吗?

r delimiter

7
推荐指数
2
解决办法
675
查看次数

如何使用dplyr的setdiff将数据分成两组

我正在使用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

r

3
推荐指数
1
解决办法
2721
查看次数

在dplyr中使用summarize_all并一起汇总

有没有办法在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组合两个单独的摘要语句来做到这一点,但有更好的方法吗?

谢谢

r dplyr

3
推荐指数
1
解决办法
263
查看次数

标签 统计

r ×5

dplyr ×3

altair ×1

delimiter ×1

python ×1

tidyr ×1