我刚刚阅读了@David Arenburg的个人资料,并找到了一些关于如何培养良好的R编程技巧/习惯的有用技巧,其中一个特别令我印象深刻.我一直认为R中的apply函数是处理数据帧的基石,但他写道:
如果您正在使用data.frames,请忘记有一个名为apply的函数 - 无论您做什么 - 都不要使用它.特别是边距为1(此功能的唯一好用途是在矩阵列上操作 - 边距为2).
一些好的选择:?do.call,?pmax/pmin,?max.col,?rowSums/rowMeans/etc,令人敬畏的matrixStats包(用于矩阵),?rowsum等等
有人可以向我解释一下吗?为什么申请职能不受欢迎?
我有一家医院的数据,变量很多,每行的日期和日期也是如此,它告诉我们每行何时“有效”。每行最多可以有效一年。
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?
我听说人们在创建先验模型后想要计算一些效果时谈论“残差建模” 。例如,如果他们知道两个变量,var_1并且var_2是相关的,我们首先建立一个模型,var_1然后对var_2之后的影响进行建模。我的问题是我在实践中从未见过这样做过。
我对以下内容感兴趣:
glm,我如何计算link function使用的?glm与var_2作为解释变量?我认为这与1有关。我的尝试:
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) 我想知道为什么 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 只给了我一行。这里发生了什么?
我正在与我合作,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) 有没有办法像这里的这个问题一样,向使用 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) 我在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,如果可能的话.
谢谢您的帮助
我想在我的数据集中总结一个特定的变量,而不会丢失所有其他列.我试过以下代码:
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楼
在我看来,当我在 SAS 中重新运行一个proc sql代码,并且我使用 inobs= 和 outobs= 选项时,它们每次都会给我相同的行。这使我得出结论 inobs= 和 outobs= 只给出第一行可用。这是真的?有没有像 outobs= 这样的选项会给我 outobs= n 个 随机行?