Stata有一个非常好的命令,egen这使得计算观察组的统计数据变得容易.例如,可以计算每个组的最大值,平均值和最小值,并将它们作为变量添加到详细数据集中.Stata命令是一行代码:
by group : egen max = max(x)
Run Code Online (Sandbox Code Playgroud)
我从来没有summarise在dplyr包中找到相同的命令,这使得计算每个组的统计数据变得容易,但是我必须运行一个循环来将统计数据与每个观察结果相关联:
library("dplyr")
N <- 1000
tf <- data.frame(group = sample(1:100, size = N, replace = TRUE), x = rnorm(N))
table(tf$group)
mtf <- summarise(group_by(tbl_df(tf), group), max = max(x))
tf$max <- NA
for (i in 1:nrow(mtf)) {
tf$max[tf$group == mtf$group[i]] <- mtf$max[i]
}
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的解决方案?
我有一个带有DataTables的RStudio Shiny服务器页面,我在下面的示例中使用了TableTools和ColReorder,但是ColVis(Show/hide columns按钮)的行为方式与http://datatables.net/extensions/colvis/中的示例相同:
单击Show/hide columns按钮时,列表会与下面表格中的值混淆,我无法通过再次单击按钮或单击页面中的任何其他位置使列表消失(同样,数据表页面中的示例表现正常).

另外,我对使用sDom表中的不同元素进行排序感到困惑.我希望Show/hide columns按钮位于右上角而不是左上角.我也不确定如何订购sDom表格中的不同元素,以便在更改列的顺序后,保存为CSV/Excel或隐藏某些列将为我提供新的表格布局而不是原始的布局.
有任何想法吗?
shinyUI(pageWithSidebar(
h1('Diamonds DataTable with TableTools'),
tagList(
singleton(tags$head(tags$script(src='//cdnjs.cloudflare.com/ajax/libs/datatables/1.9.4/jquery.dataTables.min.js',type='text/javascript'))),
singleton(tags$head(tags$script(src='//cdnjs.cloudflare.com/ajax/libs/datatables-tabletools/2.1.5/js/TableTools.min.js',type='text/javascript'))),
singleton(tags$head(tags$script(src='//cdn.datatables.net/colreorder/1.1.1/js/dataTables.colReorder.min.js',type='text/javascript'))),
singleton(tags$head(tags$script(src='//cdn.datatables.net/colvis/1.1.0/js/dataTables.colVis.min.js',type='text/javascript'))),
singleton(tags$head(tags$script(src='//cdnjs.cloudflare.com/ajax/libs/datatables-tabletools/2.1.5/js/ZeroClipboard.min.js',type='text/javascript'))),
singleton(tags$head(tags$link(href='//cdnjs.cloudflare.com/ajax/libs/datatables-tabletools/2.1.5/css/TableTools.min.css',rel='stylesheet',type='text/css'))),
singleton(tags$script(HTML("if (window.innerHeight < 400) alert('Screen too small');")))
),
dataTableOutput("mytable")
)
)
Run Code Online (Sandbox Code Playgroud)
shinyServer(function(input, output, session) {
output$mytable = renderDataTable({
diamonds[,1:6]
}, options = list(
"sDom" = 'RMDCT<"clear">lfrtip',
"oTableTools" = list(
"sSwfPath" = "//cdnjs.cloudflare.com/ajax/libs/datatables-tabletools/2.1.5/swf/copy_csv_xls.swf",
"aButtons" = list(
"copy",
"print",
list("sExtends" = "collection",
"sButtonText" = "Save",
"aButtons" = c("csv","xls") …Run Code Online (Sandbox Code Playgroud) 我有一个更大的现有数据帧.对于这个较小的例子,我想根据"first"列替换一些变量(将state(df1)替换为newstate(df2)).我的问题是值返回为NA,因为只有一些名称在新数据帧(df2)中匹配.
现有数据框:
state = c("CA","WA","OR","AZ")
first = c("Jim","Mick","Paul","Ron")
df1 <- data.frame(first, state)
first state
1 Jim CA
2 Mick WA
3 Paul OR
4 Ron AZ
Run Code Online (Sandbox Code Playgroud)
与现有数据帧匹配的新数据帧
state = c("CA","WA")
newstate = c("TX", "LA")
first =c("Jim","Mick")
df2 <- data.frame(first, state, newstate)
first state newstate
1 Jim CA TX
2 Mick WA LA
Run Code Online (Sandbox Code Playgroud)
试图使用匹配但返回NA为"状态",其中在原始数据帧中找不到与df2匹配的"第一"变量.
df1$state <- df2$newstate[match(df1$first, df2$first)]
first state
1 Jim TX
2 Mick LA
3 Paul <NA>
4 Ron <NA>
Run Code Online (Sandbox Code Playgroud)
有没有办法忽略nomatch或nomatch按原样返回现有变量?这将是期望结果的例子:吉姆/米克的状态得到更新,而保罗和罗恩的状态不会改变.
first state
1 Jim TX
2 Mick LA …Run Code Online (Sandbox Code Playgroud) 我一直在查看diagrammeR包(http://rich-iannone.github.io/DiagrammeR/)以在rMarkdown中生成图表.这在用HTML呈现文档时效果很好; 现在我的问题是是否有可能将文档输出为MS Word文档?
例如,考虑一下:
---
title: "Test"
author: "Test"
date: "Monday, May 18, 2015"
output: html_document
---
```{r, echo=FALSE, warning=FALSE}
if (!require("DiagrammeR")) library("DiagrammeR")
```
Check out this diagram:
```{r, echo=FALSE, results='asis'}
DiagrammeR::grViz("
digraph rmarkdown {
node [shape = box ]
'A' -> 'B'
}
")
```
Run Code Online (Sandbox Code Playgroud)
使用HTML作为输出格式就像一个魅力.但是,当我切换到MS Word时,我得到的只是:
Error: Functions that produce HTML output found in document targeting docx output.
Please change the output type of this document to HTML.
Run Code Online (Sandbox Code Playgroud)
任何想法,将不胜感激.
非常感谢,Philipp
假设我有一个年整数列表如下:
olap = c(1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2011, 2012, 2013, 2014);
Run Code Online (Sandbox Code Playgroud)
什么是最不复杂和最像R的方式来确定连续年份的最长范围以及开始日期和结束日期?我希望获得:长度:10,开始年份:1997年,结束年份:2006年.
我一直在网上搜索一下这个网站,人们似乎建议在这种情况下使用rle().所以我解决问题的方法如下:
olap_diff_rle = rle(diff(olap));
max_diff_run = max(olap_diff_rle$lengths[olap_diff_rle$values==1]);
idx = cumsum(olap_diff_rle$lengths)[olap_diff_rle$lengths==max_diff_run] + 1;
max_olap_end_year = olap[idx];
max_olap_start_year = olap_end_year - max_diff_run;
max_olap = max_diff_run + 1;
Run Code Online (Sandbox Code Playgroud)
但这看起来非常优雅.必须有一个不那么复杂的方式来做到这一点!?我只想使用base R,所以没有包.我读过一个人也可能会使用类似的东西which(diff()!= 1)来确定休息时间并从那里继续?
数据集包含三个变量:id,sex和grade(factor).
mydata <- data.frame(id=c(1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4), sex=c(1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1),
grade=c("a","b","c","d","e", "x","y","y","x", "q","q","q","q", "a", "a", "a", NA, "b"))
Run Code Online (Sandbox Code Playgroud)
对于每个ID,我需要查看我们有多少个唯一等级,然后创建一个新列(调用N)来记录等级频率.例如,对于ID = 1,我们有五个"等级"的唯一值,因此N = 4; 对于ID = 2,我们有两个"等级"的唯一值,所以N = 2; 对于ID = 4,我们有两个"等级"的唯一值(忽略NA),因此N = 2.
最终的数据集是
mydata <- data.frame(id=c(1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4), sex=c(1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1),
grade=c("a","b","c","d","e", "x","y","y","x", "q","q","q","q", "a", "a", "a", NA, "b"))
mydata$N <- c(5,5,5,5,5,2,2,2,2,1,1,1,1,2,2,2,2,2)
Run Code Online (Sandbox Code Playgroud) 我有以下数据集:
sample.data <- data.frame(Step = c(1,2,3,4,1,2,1,2,3,1,1),
Case = c(1,1,1,1,2,2,3,3,3,4,5),
Decision = c("Referred","Referred","Referred","Approved","Referred","Declined","Referred","Referred","Declined","Approved","Declined"))
sample.data
Step Case Decision
1 1 1 Referred
2 2 1 Referred
3 3 1 Referred
4 4 1 Approved
5 1 2 Referred
6 2 2 Declined
7 1 3 Referred
8 2 3 Referred
9 3 3 Declined
10 1 4 Approved
11 1 5 Declined
Run Code Online (Sandbox Code Playgroud)
是否有可能在R中将其转换为宽表格格式,并在标题上做出决定,每个单元格的值都是事件的计数,例如:
Case Referred Approved Declined
1 3 1 0
2 1 0 1
3 2 0 1
4 0 1 …Run Code Online (Sandbox Code Playgroud) 我有一个大型数据框(1616610行,255列),我需要根据一个键将每列的唯一值粘贴在一起.
例如:
> data = data.frame(a=c(1,1,1,2,2,3),
b=c("apples", "oranges", "apples", "apples", "apples", "grapefruit"),
c=c(12, 22, 22, 45, 67, 28),
d=c("Monday", "Monday", "Monday", "Tuesday", "Wednesday", "Tuesday"))
> data
a b c d
1 1 apples 12 Monday
2 1 oranges 22 Monday
3 1 apples 22 Monday
4 2 apples 45 Tuesday
5 2 apples 67 Wednesday
6 3 grapefruit 28 Tuesday
Run Code Online (Sandbox Code Playgroud)
我需要的是聚合255列中每一列中的每个唯一值,并为每个唯一值返回一个带逗号分隔符的新数据框.像这样:
a b c d
1 1 apples, oranges 12, 22 Monday
2 2 apples 45, 67 Tuesday, Wednesday
3 …Run Code Online (Sandbox Code Playgroud) 我可以从文档中看到rlang::enquo()和rlang::quo()在不同的上下文中使用。因此,我rlang::enysm()最近在函数声明中使用了(见下文)。然而,包裹在另一个 SE 函数调用中,我得到了一个意外错误,我猜这与惰性求值有关(如果我force(x)在 中,它就会消失f_enysm())。但似乎我也可以通过简单地使用sym(x)而不是ensym(x)因为x是一个不传达任何关于环境的信息(而不是quosures)的字符串来解决这个问题。
那安全吗?
如果是,我不知道什么时候应该更喜欢ensym(),sym并且建议的用途似乎与quo()/ enquo()、expr()/enexpr()等使用的术语不一致。
library(rlang)
f_ensym <- function(data, x, fun) {
x <- fun(x)
head(dplyr::arrange(data, !!x))
}
f_ensym(mtcars, "cyl", sym)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#> 2 24.4 4 146.7 …Run Code Online (Sandbox Code Playgroud) 加入数据表:
X <- data.table(A = 1:4, B = c(1,1,1,1))
# A B
# 1: 1 1
# 2: 2 1
# 3: 3 1
# 4: 4 1
Y <- data.table(A = 4)
# A
# 1: 4
Run Code Online (Sandbox Code Playgroud)
通过
X[Y, on = .(A == A)]
# A B
# 1: 4 1
Run Code Online (Sandbox Code Playgroud)
返回预期结果.但是,我希望这条线:
X[Y, on = .(A < A)]
# A B
# 1: 4 1
# 2: 4 1
# 3: 4 1
Run Code Online (Sandbox Code Playgroud)
回来
A B
1: 1 1 …Run Code Online (Sandbox Code Playgroud)