小编Hel*_*len的帖子

R:申请vs do.call

我刚刚阅读了@David Arenburg的个人资料,并找到了一些关于如何培养良好的R编程技巧/习惯的有用技巧,其中一个特别令我印象深刻.我一直认为R中的apply函数是处理数据帧的基石,但他写道:

如果您正在使用data.frames,请忘记有一个名为apply的函数 - 无论您做什么 - 都不要使用它.特别是边距为1(此功能的唯一好用途是在矩阵列上操作 - 边距为2).

一些好的选择:?do.call,?pmax/pmin,?max.col,?rowSums/rowMeans/etc,令人敬畏的matrixStats包(用于矩阵),?rowsum等等

有人可以向我解释一下吗?为什么申请职能不受欢迎?

r apply do.call

7
推荐指数
1
解决办法
762
查看次数

按新年拆分日期行

我有一家医院的数据,变量很多,每行的日期和日期也是如此,它告诉我们每行何时“有效”。每行最多可以有效一年。

test = data.frame(ID=c(10,10,10,12,12), Disease=c("P","P","P","D","P"), Pass=c("US","US","US","EN","EN"),
                  Payment=c(110,110,115,240,255), 
                  from_date=as.POSIXct(c("2008-01-09","2009-01-09","2010-01-09","2008-01-01","2013-12-31")),
                  to_date=as.POSIXct(c("2009-01-08","2010-01-08","2011-01-08","2008-12-31","2014-12-30"))
                  )
Run Code Online (Sandbox Code Playgroud)

对于从一年到另一年的行,我想对行进行拆分,以便最终得到两行而不是原始行,并且还要操纵from_date和to_date,从而最终得到一个新的数据集看起来像这样:

  test_desired = data.frame(ID=c(10,10,10,10,10,10,12,12,12), Disease=c("P","P","P","P","P","P","D","P","P"), Pass=c("US","US","US","US","US","US","EN","EN","EN"),
                              Payment=c(110,110,110,110,115,115,240,255,255), 
                              from_date=as.POSIXct(c("2008-01-09","2009-01-01","2009-01-09","2009-01-01","2010-01-09","2011-01-01","2008-01-01","2013-12-31","2014-01-01")),
                              to_date=as.POSIXct(c("2008-12-31","2009-01-08","2009-12-31","2010-01-08","2010-12-31","2011-01-08","2008-12-31","2013-12-31","2014-12-30"))
    )    
Run Code Online (Sandbox Code Playgroud)

尝试

library(lubridate) #for function "year" below
test_desired=test
row=c()
tmp=c()
for(i in 1:nrow(test_desired)){
  if(year(test_desired$from_date)[i]<year(test_desired$to_date)[i]){
    test_desired$to_date[i] = as.POSIXct(paste0(year(test_desired$from_date[i]),"-12-31"))
    row = test_desired[i,]
    row$from_date = as.POSIXct(paste0(year(test$to_date[i]),"-01-01"))
    row$to_date = test$to_date[i]
    tmp=rbind(tmp,row)

  } else next
}
test_desired=rbind(test_desired,tmp)
library(dplyr)
test_desired=arrange(test_desired,ID,from_date)
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方法可以做到这一点,例如使用dplyr?

r

7
推荐指数
1
解决办法
205
查看次数

R:残差建模

我听说人们创建先验模型想要计算一些效果时谈论“残差建模” 。例如,如果他们知道两个变量,var_1并且var_2是相关的,我们首先建立一个模型,var_1然后对var_2之后的影响进行建模。我的问题是我在实践中从未见过这样做过。

我对以下内容感兴趣:

  1. 如果我使用的是glm,我如何计算link function使用的?
  2. 我运行的第二时选择什么样的分布glmvar_2作为解释变量?我认为这与1有关。
  3. 这是否与使用第一个模型预测作为第二个模型中的偏移量有关?

我的尝试

dt <- data.table(mtcars) # I have a hypothesis that `mpg` is a function of both `cyl` and `wt`
dt[, cyl := as.factor(cyl)]
model <- stats::glm(mpg ~ cyl, family=Gamma(link="log"), data=dt) # I want to model `cyl` first
dt[, pred := stats::predict(model, type="response", newdata=dt)]
dt[, res := mpg - pred]

# will this …
Run Code Online (Sandbox Code Playgroud)

modeling r glm

7
推荐指数
1
解决办法
145
查看次数

R:使用 dplyr 和 data.table 进行左连接的不同结果

我想知道为什么 data.table 的左连接没有给我多个匹配项,似乎有一些奇怪的内置“无重复”,这并不能真正使其成为左连接,不是吗?

数据

test=data.table(mtcars[1,])
test2=data.table(mtcars[c(1,1),])
Run Code Online (Sandbox Code Playgroud)

数据表

test[test2, on = c(carb = "carb"), wt2 := i.wt]
Run Code Online (Sandbox Code Playgroud)

dplyr

test %>% left_join(test2 %>% select(carb, wt) %>% rename(wt2 = wt), 
                       by = "carb")
Run Code Online (Sandbox Code Playgroud)

dplyr 给了我正确的两行结果,但 data.table 只给了我一行。这里发生了什么?

r left-join dplyr data.table

5
推荐指数
1
解决办法
1530
查看次数

R:unequi join 与合并功能

我正在与我合作,data.table我想做一个非平等的左加入/合并。

我有一张包含汽车价格的表格和另一张表格来确定每辆车属于哪个汽车类别:

data_priceclass <- data.table()
data_priceclass$price_from <- c(0, 0, 200000, 250000, 300000, 350000, 425000, 500000, 600000, 700000, 800000, 900000, 1000000, 1100000, 1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000) 
data_priceclass$price_to <- c(199999, 199999, 249999, 299999, 349999, 424999, 499999, 599999, 699999, 799999, 899999, 999999, 1099999, 1199999, 1299999, 1399999, 1499999, 1599999, 1699999, 1799999, 1899999)
data_priceclass$price_class <- c(1:20, 99)
Run Code Online (Sandbox Code Playgroud)

我使用非对等连接来合并两个表。但是 x[y]-join 语法data.table会删除重复项。

cars <- data.table(car_price = c(190000, 500000))
cars[data_priceclass, on = c("car_price >= price_from", 
                             "car_price < price_to"),
     price_class := i.price_class,] …
Run Code Online (Sandbox Code Playgroud)

r data.table non-equi-join

5
推荐指数
1
解决办法
143
查看次数

在x轴上绘制低于月份的年份

我不是在寻找编码方面的帮助,只是帮助我应该采取什么方向,即使用哪些功能.我想知道是否有可能使用ggplot来绘制类似这样的东西:

在此输入图像描述

r ggplot2

4
推荐指数
1
解决办法
303
查看次数

rmarkdown html 图中的缩放功能

有没有办法像这里的这个问题一样,向使用 rmarkdown 创建的 html_documents 添加缩放功能?我在 Rstudio 工作。我已经尝试过以下方法,但当然,它不起作用:

---
title: Zoom in on Plots
author: "MS"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<style>
.zoomDiv {
  opacity: 0;
  position:absolute;
  top: 50%;
  left: 50%;
  z-index: 50;
  transform: translate(-50%, -50%);
  box-shadow: 0px 0px 50px #888888;
  max-height:100%; 
  overflow: scroll;
}

.zoomImg {
  width: 100%;
}
</style>


<script type="text/javascript">
  $(document).ready(function() {
    $('slides').prepend("<div class=\"zoomDiv\"><img src=\"\" class=\"zoomImg\"></div>");
    // onClick function for all plots (img's)
    $('img:not(.zoomImg)').click(function() {
      $('.zoomImg').attr('src', $(this).attr('src'));
      $('.zoomDiv').css({opacity: '1', …
Run Code Online (Sandbox Code Playgroud)

html zooming r-markdown

4
推荐指数
1
解决办法
3948
查看次数

需要计算R中向量中特定转换的数量

我在R中编写一个采样器,它基本上是一个很大的for循环,对于每个迭代我都要计算一个向量中的转换数.我有一个名为k的向量,它包含0和1,向量中有1000个条目.

我使用了以下非常慢的代码:

#we determine the number of transitions n00,n01,n10,n11
  n00=n01=n10=n11=0 #reset number of transitions between states from last time
  for(j in 1:(1000-1)){
    if(k[j+1]==1 && k[j]==0) {n01<-n01+1}
    else { if(k[j+1]==1 && k[j]==1) {n11<-n11+1}
           else { if(k[j+1]==0 && k[j]==1) {n10<-n10+1}
                  else{n00<-n00+1}
           }

    }
  }
Run Code Online (Sandbox Code Playgroud)

因此,每次循环运行时,变量n00,n01,n10,n11计算向量中的转换.例如,n00计算0后跟另一个0的次数.依此类推......

这很慢,我对R很新,所以我在这里绝望.我不明白如何使用grep,如果可能的话.

谢谢您的帮助

r vector

3
推荐指数
1
解决办法
991
查看次数

如何使用proc摘要并保留所有变量(不指定它们)

我想在我的数据集中总结一个特定的变量,而不会丢失所有其他列.我试过以下代码:

proc summary data=work.test nway missing; 
class var_1 var_2 ; *groups;
var salary; 
id _character_ _numeric_; * keeps all variables;
output out=test2(drop=_:) sum= ;
run;
Run Code Online (Sandbox Code Playgroud)

但它似乎没有正确总结,对于"薪水"列,我只剩下每组中最后一个值的值(var_1和var_2).如果我删除

 id _character_ _numeric_; 
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我松开了所有其他列.

示例:

数据:

data salary;
   input name $ dept $ Salary Sex $;
   datalines;
John Sales 23 M
John Sales 43 M
Mary Acctng 21 F
; 
Run Code Online (Sandbox Code Playgroud)

期望的输出:

John Sales 66 M

Mary Acctng 21楼

summary sas

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

Proc SQL:inobs 和 outobs 不是随机的

在我看来,当我在 SAS 中重新运行一个proc sql代码,并且我使用 inobs= 和 outobs= 选项时,它们每次都会给我相同的行。这使我得出结论 inobs= 和 outobs= 只给出第一行可用。这是真的?有没有像 outobs= 这样的选项会给我 outobs= n 个 随机行?

sql sas

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