在更新到 dplyr 开发版本 0.8.99.9003 后运行 group_by 和 summarise() 时,我开始收到一条新消息(见帖子标题)。
以下是重新创建输出的示例:
library(tidyverse)
library(hablar)
df <- read_csv("year, week, rat_house_females, rat_house_males, mouse_wild_females, mouse_wild_males
2018,10,1,1,1,1
2018,10,1,1,1,1
2018,11,2,2,2,2
2018,11,2,2,2,2
2019,10,3,3,3,3
2019,10,3,3,3,3
2019,11,4,4,4,4
2019,11,4,4,4,4") %>%
convert(chr(year,week)) %>%
mutate(total_rodents = rowSums(select_if(., is.numeric))) %>%
convert(num(year,week)) %>%
group_by(year,week) %>% summarise(average = mean(total_rodents))
Run Code Online (Sandbox Code Playgroud)
输出 tibble 是正确的,但出现此消息:
summarise()按“年份”重新分组输出(用.groups参数覆盖)
这应该如何解释?当我按年和周分组时,为什么它只报告按“年”重新分组?另外,覆盖是什么意思,我为什么要这样做?
我不认为该消息表明存在问题,因为它出现在整个 dplyr 小插图中:https ://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
我相信这是一条新消息,因为它只出现在最近的 SO 问题上,例如如何使用 dplyr 融化pairwise.wilcox.test 输出?和R 聚合多列(都没有解决重组/覆盖消息)。
谢谢!
我想知道是否有一种方法可以使用函数with summarise(dplyr 0.1.2)返回多个值(例如包中的describe函数psych).
如果没有,是因为它尚未实施,还是有理由不是一个好主意?
例:
require(psych)
require(ggplot2)
require(dplyr)
dgrp <- group_by(diamonds, cut)
describe(dgrp$price)
summarise(dgrp, describe(price))
Run Code Online (Sandbox Code Playgroud)
生产: Error: expecting a single value
我曾经和R一起工作,真的很喜欢你可以轻松分组并总结的dplyr软件包.
但是,在pandas中,我没有看到相当的总结,这是我在Python中实现它的方式:
import pandas as pd
data = pd.DataFrame(
{'col1':[1,1,1,1,1,2,2,2,2,2],
'col2':[1,2,3,4,5,6,7,8,9,0],
'col3':[-1,-2,-3,-4,-5,-6,-7,-8,-9,0]
}
)
result = []
for k,v in data.groupby('col1'):
result.append([k, max(v['col2']), min(v['col3'])])
print pd.DataFrame(result, columns=['col1', 'col2_agg', 'col3_agg'])
Run Code Online (Sandbox Code Playgroud)
它不仅非常冗长,而且可能不是最优化和最有效的.(我曾经重写过一个dplyr实现for-loop groupby,性能提升很大).
在R中代码将是
data %>% groupby(col1) %>% summarize(col2_agg=max(col2), col3_agg=min(col3))
Run Code Online (Sandbox Code Playgroud)
在Python或for循环中是否有一个有效的等价物是我必须使用的.
另外,@ ahan真的给了我答案的解决方案,这是一个后续问题,我将在这里列出而不是评论:
什么是相当于 groupby.agg
使用python我创建了包含相似度值的以下数据框:
cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture jaccard
1 0.770 0.489 0.388 0.57500000 0.5845137 0.3920000 0.00000000
2 0.067 0.496 0.912 0.13865546 0.6147309 0.6984127 0.00000000
3 0.514 0.426 0.692 0.36440678 0.4787535 0.5198413 0.05882353
4 0.102 0.430 0.739 0.11297071 0.5288008 0.5436508 0.00000000
5 0.560 0.735 0.554 0.48148148 0.8168083 0.4603175 0.00000000
6 0.029 0.302 0.558 0.08547009 0.3928234 0.4603175 0.00000000
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个R脚本来生成另一个反映二进制数据的数据框,但如果该值大于0.5,则应用我的条件条件
伪代码:
if (cosinFcolor > 0.5 & cosinFcolor <= 0.6)
bin = 1
if (cosinFcolor > 0.6 & cosinFcolor <= 0.7)
bin = 2 …Run Code Online (Sandbox Code Playgroud) 我正在对数据进行分组然后对其进行总结,但是还想保留另一个列.我不需要对该列的内容进行任何评估,因为它始终与group_by列相同.我可以将它添加到group_by语句中,但这似乎并不"正确".我希望State.Full.Name在分组后保留State.谢谢
TDAAtest <- data.frame(State=sample(state.abb,1000,replace=TRUE))
TDAAtest$State.Full.Name <- state.name[match(TDAAtest$State,state.abb)]
TDAA.states <- TDAAtest %>%
filter(!is.na(State)) %>%
group_by(State) %>%
summarize(n=n()) %>%
ungroup() %>%
arrange(State)
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个输出,按因子级别计算计数占总计数(在数据框中)的百分比,但似乎无法弄清楚如何在输出中保留分组结构。
\n我可以获得我想要除以的总计数...
\ndf %>% summarise(sum(num))\n# 15\nRun Code Online (Sandbox Code Playgroud)\n...以及按组划分的总数...
\ndf %>% group_by(species) %>% summarise(sum(num))\n# A tibble: 3 \xc3\x97 2\n# species `sum(num)`\n# <chr> <int>\n# 1 Farfantepenaeus duorarum 4\n# 2 Farfantepenaeus notialis 0\n# 3 Farfantepenaeus spp 11\nRun Code Online (Sandbox Code Playgroud)\n但我无法让它看起来像这样......
\n# ???\n# species Percent\n# <chr> <int>\n# 1 Farfantepenaeus duorarum 4 / 15 = 0.267\n# 2 Farfantepenaeus notialis 0 / 15 = 0.000\n# 3 Farfantepenaeus spp 11 / 15 = 0.733\nRun Code Online (Sandbox Code Playgroud)\n我得到的最接近的是这个,但是因为我使用了 reframe() 它返回了未分组的数据
\ndf %>% group_by(species) %>% \n …Run Code Online (Sandbox Code Playgroud) 我的问题与Applying group_by非常相似,并在保留所有列信息的同时对数据进行汇总, 但我想保留被排除的列,因为它们在分组后会发生冲突。
Label <- c("203c","203c","204a","204a","204a","204a","204a","204a","204a","204a")
Type <- c("wholefish","flesh","flesh","fleshdelip","formula","formuladelip",
"formula","formuladelip","wholefish", "wholefishdelip")
Proportion <- c(1,1,0.67714,0.67714,0.32285,0.32285,0.32285,
0.32285, 0.67714,0.67714)
N <- (1:10)
C <- (1:10)
Code <- c("c","a","a","b","a","b","c","d","c","d")
df <- data.frame(Label,Type, Proportion, N, C, Code)
df
Label Type Proportion N C Code
1 203c wholefish 1.0000 1 1 c
2 203c flesh 1.0000 2 2 a
3 204a flesh 0.6771 3 3 a
4 204a fleshdelip 0.6771 4 4 b
5 204a formula 0.3228 5 5 a
6 204a formuladelip …Run Code Online (Sandbox Code Playgroud) 我有一个想要总结的数据集。首先,我想要主客场比赛的总和,这是我可以做到的。但是,我还想知道每个子类别(主场、客场)中有多少个异常值(定义为超过 300 分)。
如果我没有使用summary,我知道dplyr有这个count()功能,但我希望这个解决方案出现在我的summarize()通话中。这是我所拥有的和我尝试过的但未能执行的内容:
#Test data
library(dplyr)
test <- tibble(score = c(100, 150, 200, 301, 150, 345, 102, 131),
location = c("home", "away", "home", "away", "home", "away", "home", "away"),
more_than_300 = c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE))
#attempt 1, count rows that match a criteria
test %>%
group_by(location) %>%
summarize(total_score = sum(score),
n_outliers = nrow(.[more_than_300 == FALSE]))
Run Code Online (Sandbox Code Playgroud) 我最近构建了一个简单的 R 脚本来总结三个不同的数据框。自从更新到最新版本的 R 和 R Studio 后,我遇到了以前从未见过的输出,在 dplyr 中仅对其中一个数据帧使用汇总函数(其他两个都很好)。我还收到了一系列我不熟悉的警告。请注意,在更新之前,我完全按照编写的方式运行脚本,任何数据框都没有问题。
有问题的数据框称为VO2,其设置如下:
Name Sex VO2
AthleteA M 50
AthleteA M 52
AthleteA M NA
AthleteB M 49
AthleteB M 56
AthleteB M 47
AthleteC M 42
AthleteC M NA
AthleteC M 41
AthleteD M NA
AthleteD M NA
AthleteD M NA
Run Code Online (Sandbox Code Playgroud)
我运行的代码是:
Test.Summary.VO2 = VO2 %>% group_by(Name, Sex) %>%
summarise(Best.Score = max(VO2, na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)
此代码生成以下摘要:
Name Sex Best.Score
AthleteA M 52
AthleteB M 56
AthleteC M 42
AthleteD M -Inf
Run Code Online (Sandbox Code Playgroud)
-Inf 值在输出中是全新的。我无法弄清楚为什么它现在出现在只有 …
我试图将观察的 df 减少到单个观察(单行)。我想 summarise_if 是带有均值的数字,而 if 是带有模式的字符串或因子。下面的代码不起作用,但我希望它给出了想法。谢谢!
#data frame
num <- c(1:7)
str <- c("toy","control","play",NA,"give","toy","toy")
df_finale <- data.frame(num,str)
#mode function
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
#df reduction
df_finale <- df_finale %>%
summarize_if(is.numeric, mean, na.rm = TRUE) %>%
summarize_else_if(!is.numeric, Mode)
Run Code Online (Sandbox Code Playgroud)