让我深入研究.想象一下,你有这样的数据:
df <- data.frame(one = c(1, 1, NA, 13),
two = c(2, NA,10, 14),
three = c(NA,NA,11, NA),
four = c(4, 9, 12, NA))
Run Code Online (Sandbox Code Playgroud)
这给了我们:
df
# one two three four
# 1 1 2 NA 4
# 2 1 NA NA 9
# 3 NA 10 11 12
# 4 13 14 NA NA
Run Code Online (Sandbox Code Playgroud)
每行分别在第1,2,3和4周进行测量.假设数字代表自上次测量发生以来的一些累积测量值.例如,在第1行中,"4"列中的"4"表示第3周和第4周的累积值.
现在我想通过在测量前几周将测量值均匀分布到前几周没有进行测量的情况下"均匀"这些数字(在这里可以自由纠正我的术语).例如,第1行应该是读取的
1 2 2 2
Run Code Online (Sandbox Code Playgroud)
因为原始数据中的4表示2周的累积值(周"三"和"四"),并且4/2是2.
最终的最终结果应如下所示:
df
# one two three four
# 1 1 2 2 2
# 2 1 3 3 …Run Code Online (Sandbox Code Playgroud) 让我直接深入一个例子来说明我的问题:
rm(list=ls())
n <- 100
df <- data.frame(y=rnorm(n), x1=rnorm(n), x2=rnorm(n) )
fm <- lm(y ~ x1 + poly(x2, 2), data=df)
Run Code Online (Sandbox Code Playgroud)
现在,我想看看以前使用过的数据.这几乎可以通过使用
temp.data <- fm$model
Run Code Online (Sandbox Code Playgroud)
然而,x2将被分成poly(x2,2),本身将是一个数据帧,因为它包含的价值x2和x2^2.请注意,它似乎x2包含在这里,但由于polynomal使用正交分量,temp.data$x2因此不一样df$x2.如果你在以下之后直观地比较变量,也可以看到这一点:new.dat <- cbind(df, fm$model).
现在,对一些问题:
首先,最重要的是,有一种方法可以x2从原始形式的lm对象中检索.或者更一般地说,如果某个函数f已应用于lm-formula中的某个变量,是否可以从lm-object中提取基础变量(不进行特定于案例的数学运算)?请注意,我知道我可以通过其他方式检索数据,但我想知道我是否可以从lm-object本身提取它.
第二,更一般地说,由于我明确没有要求model.matrix(fm),为什么我得到被操纵的数据?这背后的基本理念是什么?有人知道吗?
第三,该命令head(new.dat)显示我x2已分成两部分.View(new.dat)但是,当我键入时,我看到的只有一列.这让我感到困惑和令人难以置信.如何可以在两个colums被表示为一个,为什么会有之间的差异head和View?如果有人能解释,我会感激不尽!
如果这些问题太基础,请道歉.在这种情况下,我将非常感谢任何有关相关手册的指示.
提前致谢!
关于范围,环境和功能的讨论已经很多.参见此处或此处.但是,我不确定我是否找到了解决以下问题的好方法:
df <- data.frame(id=rep(LETTERS[1:2],each=2), x=1:4)
d <- -1
myfun <- function(df, d){
require(plyr)
new.dat <- ddply(df, .(id), transform, x=x*d)
return(new.dat)}
myfun(df, 1)
Run Code Online (Sandbox Code Playgroud)
您可以轻松验证是否使用了全局定义d=-1,而不是d=1参数中提供的内容.(如果不d存在全局定义,则object not found返回消息)现在最大的问题是:如何d使用所使用的函数而不是全局定义的参数d?
我的印象是以下应该有效:
myfun2 <- function(df, d){
here <- environment()
new.dat <- ddply(df, .(id), transform, x=x*with(here,d))
return(new.dat)}
myfun2(df, 1)
Run Code Online (Sandbox Code Playgroud)
我的理解是从环境中with(here, d)检索对象.所以,结果应该是.但是,返回错误,说dhere1
Error in eval(substitute(expr), data, enclos = parent.frame()) :
invalid 'envir' argument of type 'closure'
Run Code Online (Sandbox Code Playgroud)
我不确定我理解为什么这不起作用,如果有人能够对此有所了解,或者如果你能提供替代解决方案,我会很高兴.请注意,将整个 …
我是C++编程新手(Rcpp用于无缝集成R),我很欣赏一些关于如何加速计算的建议.
请考虑以下示例:
testmat <- matrix(1:9, nrow=3)
testvec <- 1:3
testmat*testvec
# [,1] [,2] [,3]
#[1,] 1 4 7
#[2,] 4 10 16
#[3,] 9 18 27
Run Code Online (Sandbox Code Playgroud)
在这里,R循环使用testvec,松散地说,testvec"变成"一个testmat与此乘法目的相同的矩阵.然后返回Hadamard产品.我希望使用Rcpp,这就是我希望i矩阵中-th行的每个元素testmat与i向量的-th元素相乘testvec.我的基准测试告诉我,我的实现速度非常慢,我很乐意建议如何加快速度.这是我的代码:
首先,使用Eigen:
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
using namespace Rcpp;
using namespace Eigen;
// [[Rcpp::export]]
NumericMatrix E_matvecprod_elwise(NumericMatrix Xs, NumericVector ys){
Map<MatrixXd> X(as<Map<MatrixXd> >(Xs));
Map<VectorXd> y(as<Map<VectorXd> >(ys));
int k = …Run Code Online (Sandbox Code Playgroud) xyplot从lattice包中使用,我绘制了多年的时间序列.我想在这些年中添加一个阴影区域,以表明这段时间是"特殊的"(例如战争).
请道歉,如果这是微不足道的,但我无法弄清楚如何做到这一点,所以如果有人可以帮助我,或者至少指出我正确的方向,我会很高兴.我认为我的主要问题是我真的不知道如何处理这个问题.我对R来说还是比较新的lattice,特别是.
这是一个最小的例子:
xyplot( rnorm(100) ~ 1:100, type="l", col="black")
Run Code Online (Sandbox Code Playgroud)
在相应的图中,我想要从x绘图区域的底部到顶部的背景颜色(从45到65的值),例如浅灰色.
请注意,到目前为止我找到的解决方案使用base图形和polygon函数,但目的是遮蔽曲线下方或上方的区域,这与我想要做的不同.我不是"只是"想要遮挡我的线下方或我线以上的区域.相反,我想在给定的时间间隔内遮蔽整个背景.
如果有人能帮助我,我会非常感激!
我是绝对的Rcpp创造者,所以请注意,初学者的问题即将来临.
考虑这个例子:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix mat_1(NumericMatrix X){
do.stuff.with.X
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,它mat_1在R的工作空间中定义了一个函数,它将数值矩阵作为输入并在最后返回一个数字矩阵.但是,在这里看,我明白我也可以定义
SEXP mat_2(SEXP X){
Rcpp::NumericMatrix x(X);
do.stuff.with.x
}
Run Code Online (Sandbox Code Playgroud)
或者
SEXP mat_3(SEXP X){
NumericMatrix x(as<NumericMatrix>(X))
do.stuff.with.x
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,它将函数的输出定义为S表达式,并且它需要一个S表达式作为输入,它在内部转换(?)为数字矩阵.
现在,看看这份对我来说非常宝贵资源的文件,我知道我也可以写作
NumericMatrix mat_4( NumericMatrix X&){
do.stuff.with.X
}
Run Code Online (Sandbox Code Playgroud)
在这里,我的理解是,而不是使副本X,在Rcpp-函数使用到的参考 R对象.我其实不确定我明白这意味着什么.是不是没有使用SEXP副本,或者我做错了什么?此外,如果它节省了内存并因此更有效,为什么我会使用其他东西?
我相信我错过了一些选择.无论如何,我的一个大问题是:从R用户(我)的角度来看,我调用每个函数mat_1, mat_2, mat_3或mat_4提供一个数字矩阵(在我的工作区中是一个R对象,因而是一个SEXP),看来我应该得到相同的输出(一个数字矩阵,SEXP无论如何都是这样R,对吗?).对于这些看似相同的定义函数的方法的相对优点,我将不胜感激.也就是说,假设我们确切知道函数输入将是什么以及输出将是什么,
NumericMatrix而不是SEXP用于论证,反之亦然?在 Windows 计算机上,当我查看任何 mp3 文件并查看该文件的属性(标记 mp3,右键单击,属性)时,会看到标题、副标题、艺术家、专辑等的各种子字段。
我正在寻找一种访问这些属性并更改它们的方法。例如,某些文件可能指示艺术家是“GreatArtist”,而其他文件指示“The GreatArtist”或“Great Artist”。
我知道我可以通过选择与同一艺术家对应的所有文件,右键单击并手动输入所有内容来手动更改所有内容。我正在寻找一种方法来自动执行此操作,以便许多文件夹、艺术家和文件变得容易,而 R 是我选择的软件。
如何使用 R 访问这些属性?file.info()不显示这些属性。
让我跳到示例中.考虑以下等式:
frml <- formula(y ~ a + b | x + z )
Run Code Online (Sandbox Code Playgroud)
这样的配方规范例如用于AER::ivreg.
我想更新这个公式,以便它读取
frml2 <- y ~ a + b + c | x + z + w
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何分别更新条件符号前后的部分|.例如,
frml2 <- update.formula(frml, . ~ . + c | . + w)
Run Code Online (Sandbox Code Playgroud)
给
y ~ ((a + b | x + z) + c | (a + b | x + z) + w)
Run Code Online (Sandbox Code Playgroud)
这不是我想要的.问题是.指右侧(或左侧)的整个公式,包括条件.有谁知道我如何相应地更新公式?
一种方法似乎是将公式转换为字符向量,将向量拆分为|,添加我想要添加的内容,并将公式重新组合在一起.虽然这很容易,但我觉得必须有一种更简单的方法.我当然不是第一个处理这类问题的人.任何建议/提示/评论将不胜感激!
我正在尝试从平均值为 5、标准差为 3 的正态分布模拟 5000 个大小为 5 的样本。然后我想计算每个样本的平均值并制作样本平均值的直方图
我当前的代码没有给我错误,但我认为这是不对的:
nrSamples = 5000
e <- list(mode="vector",length=nrSamples)
for (i in 1:nrSamples) {
e[[i]] <- rnorm(n = 5, mean = 5, sd = 3)
}
sample_means <- matrix(NA, 5000,1)
for (i in 1:5000){
sample_means[i] <- mean(e[[i]])
}
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题有什么想法吗?我对 R 非常非常陌生!
r ×9
c++ ×2
rcpp ×2
armadillo ×1
background ×1
color-scheme ×1
eigen ×1
environment ×1
figure ×1
file ×1
formula ×1
function ×1
lattice ×1
lm ×1
plyr ×1