我有一个脚本,该脚本生成具有数量不定的值列的熊猫数据框。例如,此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 …
我试图以分组的方式将采样函数应用于数据框,如果组大小小于 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)) 会产生相同的错误。
我有什么建议可以调整我的功能,以便我可以将其应用于每个组?或者问题的另一种解决方案?
假设我有以下(简化的)小标题,其中包含向量中的组和值:
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) 对于数据库清理,我有一个矢量,比方说,菜肴,我想删除"基础"菜的所有变种,只保留基础菜.例如,如果我有......
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"也将保留在结果向量中.
我试图将多个图形元素添加到现有的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也是可行的。但是实际上,我要向绘图中添加几个不同的几何图形,因此我认为我需要在函数中一起添加多个图层。