小编Jaa*_*aap的帖子

是否有相当于Stata的egen功能?

Stata有一个非常好的命令,egen这使得计算观察组的统计数据变得容易.例如,可以计算每个组的最大值,平均值和最小值,并将它们作为变量添加到详细数据集中.Stata命令是一行代码:

by group : egen max = max(x)
Run Code Online (Sandbox Code Playgroud)

我从来没有summarisedplyr包中找到相同的命令,这使得计算每个组的统计数据变得容易,但是我必须运行一个循环来将统计数据与每个观察结果相关联:

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)

有没有人有更好的解决方案?

r stata

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

R闪亮的DataTables ColVis行为

我有一个带有DataTables的RStudio Shiny服务器页面,我在下面的示例中使用了TableTools和ColReorder,但是ColVis(Show/hide columns按钮)的行为方式与http://datatables.net/extensions/colvis/中的示例相同:

单击Show/hide columns按钮时,列表会与下面表格中的值混淆,我无法通过再次单击按钮或单击页面中的任何其他位置使列表消失(同样,数据表页面中的示例表现正常).

在此输入图像描述

另外,我对使用sDom表中的不同元素进行排序感到困惑.我希望Show/hide columns按钮位于右上角而不是左上角.我也不确定如何订购sDom表格中的不同元素,以便在更改列的顺序后,保存为CSV/Excel或隐藏某些列将为我提供新的表格布局而不是原始的布局.

有任何想法吗?

ui.R

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)

server.R

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)

jquery r shiny dt

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

使用R中的匹配函数,具有无匹配的返回值

我有一个更大的现有数据帧.对于这个较小的例子,我想根据"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)

merge r match no-match dataframe

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

在Word文档中使用DiagrammeR(使用rMarkdown生成)

我一直在查看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

r r-markdown diagrammer

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

如何识别列表中连续年份的最长范围以及开始和结束日期?

假设我有一个年整数列表如下:

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)来确定休息时间并从那里继续?

r

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

按ID的行数

数据集包含三个变量: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)

r

8
推荐指数
4
解决办法
235
查看次数

通过计数将长格式转换为宽格式的简便方法

我有以下数据集:

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)

r reshape

8
推荐指数
3
解决办法
2267
查看次数

聚合每列数据框的所有唯一值

我有一个大型数据框(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)

aggregate r

8
推荐指数
2
解决办法
2150
查看次数

什么时候使用 rlang::ensym() 而不是 rlang::sym()?

我可以从文档中看到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)

r tidyeval rlang

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

什么<表示在data.table中加入on =

加入数据表:

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)

r left-join data.table

8
推荐指数
2
解决办法
300
查看次数