小编Mar*_*kum的帖子

熊猫聚合带有动态列名

我有一个脚本,该脚本生成具有数量不定的值列的熊猫数据框。例如,此df可能是

import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B'],
'group_color' : ['green', 'green', 'green', 'blue', 'blue'],
'val1': [5, 2, 3, 4, 5], 
'val2' : [4, 2, 8, 5, 7]
})

  group group_color  val1  val2
0     A       green     5     4
1     A       green     2     2
2     A       green     3     8
3     B        blue     4     5
4     B        blue     5     7
Run Code Online (Sandbox Code Playgroud)

My goal is to get the grouped mean for each of the value columns. In this …

python aggregate pandas pandas-groupby

22
推荐指数
3
解决办法
551
查看次数

自定义分组 dplyr 函数 (sample_n)

我试图以分组的方式将采样函数应用于数据框,如果组大小小于 n,它应该从每个组或所有组成员中采样 n 个样本。

使用dplyr,我第一次尝试

library(dplyr)
mtcars %>% group_by(cyl) %>% sample_n(2)
Run Code Online (Sandbox Code Playgroud)

这在 n 小于所有组大小时有效,但当我选择大于组大小的 n 时不占用整个组(请注意,其中一个 cyl 组中有 7 辆车):

mtcars %>% group_by(cyl) %>% sample_n(8)
Error: `size` must be less or equal than 7 (size of data), 
set `replace` = TRUE to use sampling with replacement
Run Code Online (Sandbox Code Playgroud)

我试图通过创建一个适应的 group_n 函数来解决这个问题,如下所示:

sample_n_or_all <- function(tbl, n) {
  if (nrow(tbl) < n)return(tbl)
  sample_n(tbl, n)
}
Run Code Online (Sandbox Code Playgroud)

但是使用我的自定义函数 ( mtcars %>% group_by(cyl) %>% sample_n_or_all(8)) 会产生相同的错误。

我有什么建议可以调整我的功能,以便我可以将其应用于每个组?或者问题的另一种解决方案?

r sample dplyr

5
推荐指数
1
解决办法
686
查看次数

汇总到矢量输出

假设我有以下(简化的)小标题,其中包含向量中的组和值:

set.seed(1)
(tb_vec <- tibble(group = factor(rep(c("A","B"), c(2,3))),
             values = replicate(5, sample(3), simplify = FALSE)))
# A tibble: 5 x 2
  group values   
  <fct> <list>   
1 A     <int [3]>
2 A     <int [3]>
3 B     <int [3]>
4 B     <int [3]>
5 B     <int [3]>

tb_vec[[1,2]]
[1] 1 3 2
Run Code Online (Sandbox Code Playgroud)

我想通过将它们汇总(向量化)来总结每组的值向量,并尝试以下方法:

tb_vec %>% group_by(group) %>% 
  summarize(vec_sum = colSums(purrr::reduce(values, rbind)))
Run Code Online (Sandbox Code Playgroud)

错误:列的vec_sum长度必须为1(汇总值),而不是3

该错误使我感到惊讶,因为小标题(输出格式)也可以包含矢量。

我的预期输出将是以下摘要信息:

# A tibble: 2 x 2
  group vec_sum  
  <fct> <list>   
1 A     <dbl [3]>
2 B …
Run Code Online (Sandbox Code Playgroud)

r vector dplyr purrr summarize

5
推荐指数
1
解决办法
105
查看次数

从矢量中删除相似但更长的重复项

对于数据库清理,我有一个矢量,比方说,菜肴,我想删除"基础"菜的所有变种,只保留基础菜.例如,如果我有......

dishes <- c("DAL BHAT", "DAL BHAT-(SPICY)", "DAL BHAT WITH EXTRA RICE", 
            "HAMBURGER", "HAMBURGER-BIG", "HAMBURGER2", "PIZZA", 
            "PIZZA (PROSCIUTO)", "PIZZA_BOLOGNESE")
Run Code Online (Sandbox Code Playgroud)

...我想删除已经在向量中具有较短匹配版本的所有条目.因此,所得到的载体仅包括:"DAL BHAT","HAMBURGER","PIZZA".

使用嵌套for循环并针对所有其他循环检查所有内容将适用于此示例,但是对于手头的大型数据集将花费很长时间,而且我说的是更糟糕的编码.

可以假设所有条目都是大写的,并且向量已经被排序.不能假设下一个基础菜肴的第一项总是比前一项更短.

有关如何以有效的方式解决这个问题的任何建议?

奖金问题:理想情况下,我只想删除初始向量中的项目,如果它们比较短的对应项长至少3个字符.在上述情况下,这意味着"HAMBURGER2"也将保留在结果向量中.

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

使用功能将多层添加到ggplot

我试图将多个图形元素添加到现有的ggplot中。新元素将放置在指定的x值周围。简化后,我有一个原点为1的现有图p:

library(ggplot2)
p <- ggplot(data = data.frame(x = 0, y = 0), aes(x = x, y = y)) +
  geom_point()
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个可以基于定义的x位置向左和向右添加点的函数。我试过了:

add_points <- function(x) {
  geom_point(aes(x = x - 1, y = 0), color = "red") +
  geom_point(aes(x = x + 1, y = 0), color = "red")
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用添加它们时

p + add_points(x = 0)
Run Code Online (Sandbox Code Playgroud)

我懂了

错误:无法将ggproto对象一起添加。您是否忘了将此对象添加到ggplot对象?

基于带有参数的函数添加多层的ggplot方法是什么?

PS:仅使用此功能添加一层可行的,因此首先创建带有x值的小标题并将其馈送到geom_point也是可行的。但是实际上,我要向绘图中添加几个不同的几何图形,因此我认为我需要在函数中一起添加多个图层。

r function ggplot2

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

标签 统计

r ×3

dplyr ×2

aggregate ×1

function ×1

ggplot2 ×1

pandas ×1

pandas-groupby ×1

purrr ×1

python ×1

sample ×1

summarize ×1

vector ×1