我正在尝试使用 dplyr::summarize() 和 dplyr::across() 来获取行中包含多个汇总统计信息和列中的变量的小标题。我只能通过使用 dplyr::bind_rows() 来实现这个结果,但我想知道是否有更优雅的方法来获得相同的输出。
> library(tidyverse)
?? Attaching packages ?????????????????????????????????????????????? tidyverse 1.3.1 ??
? ggplot2 3.3.3 ? purrr 0.3.4
? tibble 3.1.1 ? dplyr 1.0.6
? tidyr 1.1.3 ? stringr 1.4.0
? readr 1.4.0 ? forcats 0.5.1
?? Conflicts ????????????????????????????????????????????????? tidyverse_conflicts() ??
? dplyr::filter() masks stats::filter()
? dplyr::lag() masks stats::lag()
>
> bind_rows(min = summarize(starwars, across(where(is.numeric), min,
+ na.rm = TRUE)),
+ median = summarize(starwars, across(where(is.numeric), median,
+ na.rm = TRUE)),
+ mean = summarize(starwars, across(where(is.numeric), mean, …Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的数据框:
library(tidyverse)
x <- tibble(
batch = rep(c(1,2), each=10),
exp_id = c(rep('a',3),rep('b',2),rep('c',5),rep('d',6),rep('e',4))
)
Run Code Online (Sandbox Code Playgroud)
我可以运行下面的代码来获取每个的计数exp_id:
x %>% group_by(batch,exp_id) %>%
summarise(count=n())
Run Code Online (Sandbox Code Playgroud)
生成:
batch exp_id count
<dbl> <chr> <dbl>
1 1 a 3
2 1 b 2
3 1 c 5
4 2 d 6
5 2 e 4
Run Code Online (Sandbox Code Playgroud)
生成这些计数平均值的一种非常丑陋的方法是:
x %>% group_by(batch,exp_id) %>%
summarise(count=n()) %>%
ungroup() %>%
group_by(batch) %>%
summarise(avg_exp = mean(count))
Run Code Online (Sandbox Code Playgroud)
生成:
batch avg_exp
<dbl> <dbl>
1 1 3.33
2 2 5
Run Code Online (Sandbox Code Playgroud)
有没有更简洁和“整洁”的方式来生成这个?
如何在数据中添加一列 price.wk.average 使 price.wk.average 等于上周的平均价格,并在数据中添加一列 price.mo.average 使其等于平均值上个月的价格?price.wk.average 将在整个星期内保持不变。
Dates Price Demand Price.wk.average Price.mo.average
2010-1-1 x x
2010-1-2 x x
......
2015-1-1 x x
Run Code Online (Sandbox Code Playgroud) 在summarise_at()中使用n()时,出现以下错误:
Error: n() should only be called in a data context
Call `rlang::last_error()` to see a backtrace
Run Code Online (Sandbox Code Playgroud)
其他人认为这可能是dplyrwith 的掩盖问题plyr,两个解决方案是:
summarise_at()为dplyr :: summarise_at()detach("package:plyr", unload=TRUE)都没有消除此错误,我很想知道是什么原因引起的。这是一个可重现的示例,应导致相同的错误:
Df <- data.frame(
Condition = c(rep("No", 20), rep("Yes",20)),
Height = c(rep(1,10),rep(2,10),rep(1,10),rep(2,10)),
Weight = c(rep(10,5),rep(20,5),rep(30,5), rep(40,5))
)
x <- c("Height","Weight")
Df %>%
group_by(Condition) %>%
summarise_at(vars(one_of(x)), c(mean = mean, sd = sd, count = n()))
Run Code Online (Sandbox Code Playgroud)
注意:如果删除count = n()该代码,运行不会出现任何问题
我正在尝试制作一个表格,显示N(观察次数)、百分比频率(答案 > 0)以及百分比频率的上下置信区间,我想按类型对其进行分组。
数据示例
dat <- data.frame(
"type" = c("B","B","A","B","A","A","B","A","A","B","A","A","A","B","B","B"),
"num" = c(3,0,0,9,6,0,4,1,1,5,6,1,3,0,0,0)
)
Run Code Online (Sandbox Code Playgroud)
预期输出(已填充值):
Type N Percent Lower 95% CI Upper 95% CI
A
B
Run Code Online (Sandbox Code Playgroud)
试图
library(dplyr)
library(qwraps2)
table<-dat %>%
group_by(type) %>%
summarise(N=n(),
mean.ci = mean_ci(dat$num),
"Percent"=n_perc(num > 0))
Run Code Online (Sandbox Code Playgroud)
这有助于获得 N 和百分比频率,但在我添加 mean_ci 时返回错误:“列的长度必须为 1(汇总值),而不是 3”
我试过的第二个代码,在这里找到:
table2<-dat %>%
group_by(type) %>%
summarise(N.num=n(),
mean.num = mean(dat$num),
sd.num = sd(dat$num),
"Percent"=n_perc(num > 0)) %>%
mutate(se.num = sd.num / sqrt(N.num),
lower.ci = 100*(mean.num - qt(1 - (0.05 …Run Code Online (Sandbox Code Playgroud) 我似乎可以为我的问题找到合适的代码。我想根据不同的条件创建组并汇总(总和、计数或长度)其他列。
我试过 group_by 并用不同的条件进行总结,但还没有找到任何有效的方法。
我有一个类似于这样的表:
data <- data.frame(Name= c('Anna', 'Anna', 'Anna', 'Anna', 'Anna',
'Bella', 'Bella', 'Bella', 'Camilla', 'Camilla'),
Date= c('1.1.2021', '1.1.2021', '2.1.2021', '3.1.2021', '3.1.2021',
'1.1.2021', '5.1.2021', '5.1.2021', '7.1.2021', '8.1.2021'),
Item= c('Apple','Pear', 'Zucini','Apple', 'Broccoli',
'Apple','Pear','Apple','Apple', 'Tomato'),
Category= c('Fruit', 'Fruit', 'Vegetable', 'Fruit', 'Vegetable',
'Fruit', 'Fruit', 'Fruit', 'Fruit', 'Vegetable'),
Weight_kg= c(0.2,0.3,0.5,0.4,1.1,
1,0.5,0.8,1.2,0.5)
)
Run Code Online (Sandbox Code Playgroud)
这将是我想要的输出:
desired_table <- data.frame(Name=c('Anna', 'Bella', 'Camilla'),
Shopping_days=c(3,2,2),
days_fruit=c(2,2,1),
days_vegetables=c(2,0,1),
Total_kg=c(2.5,2.3,1.7),
Fruit_kg=c(0.9,2.3,1.2),
Vegetables=c(1.6,0,0.5))
Run Code Online (Sandbox Code Playgroud)
我已经尝试了许多与此类似的代码变体,但显然不起作用:
data1 <- data %>%
group_by(Name) %>%
summarize(Shopping_days = length(unique(Date)),
days_fruit = length(unique(Date, Category='Fruit')),
days_vegetables = length(unique(Date, Category='Vegetables')), …Run Code Online (Sandbox Code Playgroud) 我有以下数据帧
a <- c(rep("CGR", 6), rep("AUS", 6), rep("ROW", 6) )
b <- c("AUT", "CH", "ROW", "ROW", "ROW", "ROW", "AUT", "CH", "ROW", "ROW", "ROW", "ROW", "AUT", "CH", "ROW", "ROW", "ROW", "ROW" )
v <- 1:18
category <- c("a", "b", "a", "a", "b", "b", "a", "b", "a", "a", "b", "b", "a", "b", "a", "a", "b", "b")
data.frame(a,b,v,category)
a b v category
1 CGR AUT 1 a
2 CGR CH 2 b
3 CGR ROW 3 a
4 CGR ROW 4 a
5 …Run Code Online (Sandbox Code Playgroud) 我想Collectors.summarizingInt用整数调用一个集合。到目前为止我看到的例子是在一个带有(比如)Employees 的 Set 上,然后被称为collect(Collecters.summorizingInt(Employee::getWage)). 对于裸整数 summorizingInt 需要一个参数,所以我可以这样做,collect(Collectors.summarizingInt((i) -> i))但提供一个自映射器感觉有点奇怪。
有替代品吗?