这是一个简单的例子.我有一个数据框,里面有三个日期:
Data <- as.data.frame(as.Date(c('1970/01/01', '1970/01/02', '1970/01/03')))
names(Data) <- "date"
Run Code Online (Sandbox Code Playgroud)
现在我添加一个由相同条目组成的列:
for(i in 1:3){
Data[i, "date2"] <- Data[i, "date"]
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
date date2
1 1970-01-01 0
2 1970-01-02 1
3 1970-01-03 2
Run Code Online (Sandbox Code Playgroud)
由于未知原因,列date2的类是数字而不是日期,它是日期类.奇怪的是,如果你明确告诉R使用日期格式:
for(i in 1:3){
Data[i, "date3"] <- as.Date(Data[i, "date"])
}
Run Code Online (Sandbox Code Playgroud)
它没有任何区别.
date date2 date3
1 1970-01-01 0 0
2 1970-01-02 1 1
3 1970-01-03 2 2
Run Code Online (Sandbox Code Playgroud)
问题似乎在于使用子集[],在更有趣的例子中,你有两列日期,并希望创建第三个日期,从另外两列中的一列中选择一个日期,具体取决于同样的因素.
当然,我们可以通过执行以下操作来回顾一切:
Data$date4 <- as.Date(Data$date2, origin = "1970-01-01")
Run Code Online (Sandbox Code Playgroud)
但我还在想:为什么?为什么会这样?为什么我的日期只能在转移到另一列时保留日期?
关于这个主题已经有很多问题了,但我找不到能够回答我这个问题的问题.
我有一个barplot(见testplot1及testplot3以下)绘制的数据集(bardata下图),并希望百分点另一个数据集添加到它(pointdata).请参阅简化示例:
bardata <- data.frame(
xname = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
yvalue = c(1, 2, 3, 2, 3, 1, 4, 2, 1),
colorname = c("a", "b", "c", "a", "b", "c", "a", "b", "c")
)
pointdata <- data.frame(
xname = c(1, 1, 3),
ypos = c(2, 4, 3),
ptyname = c("p", "q", "r")
)
testplot1 <- qplot(xname, yvalue, data= bardata, stat = "identity",
fill= factor(colorname), geom …Run Code Online (Sandbox Code Playgroud) 请考虑以下示例:
/* Create two not too interesting datasets: */
Data ones (keep = A);
Do i = 1 to 3;
A = 1;
output;
End;
run;
Data numbers;
Do B = 1 to 5;
output;
End;
Run;
/* The interesting step: */
Data together;
Set ones numbers;
if B = 2 then A = 2;
run;
Run Code Online (Sandbox Code Playgroud)
因此,数据集包含一个带有3个观测值的变量A,所有数据集和数据集编号包含一个带有5个观测值的变量(B):数字1到5.我希望结果数据集一起有两列(A和B)和A要读取的列(垂直)1,1,1,.... ,2 ,. ,.,.
但是,在执行代码时,我发现列A读取1,1,1,.... ,2,2,2,2
显然,在第五次观察中创建的2被完全保留下来,没有明显的原因.这里发生了什么?
(为了完整起见:当我将最后一个数据步骤拆分为两个时,如下所示:
Data together;
set ones numbers;
run;
Data together;
set together;
if B = 2 then A …Run Code Online (Sandbox Code Playgroud) 考虑以下两个功能:
library(ggplot2)
testdata <- as.data.frame(cbind(rep(c(1, 4), each = 50), rbinom(100, 50, .5)))
names(testdata) <- c("group", "value")
plotfun1 <- function(color) {
ggplot(data = testdata, aes(x = factor(group, levels = c(0: 4)), y = value)) +
geom_boxplot(color = color)
}
plotfun2 <- function(number) {
ggplot(data = testdata, aes(x = factor(group, levels = c(0: number)), y = value)) +
geom_boxplot(color = 'red')
}
Run Code Online (Sandbox Code Playgroud)
Plotfun1完美地工作,打电话
plotfun1('red')
Run Code Online (Sandbox Code Playgroud)
产生两个漂亮的红色箱形图.但是打电话
plotfun2(4)
Run Code Online (Sandbox Code Playgroud)
产生错误消息:
因子中的错误(组,级别= c(0:数字)):找不到对象'数字'
显然在某些情况下ggplot无法"找到"函数的参数,在某些情况下它是.这里发生了什么?
PS我知道有一个简单的解决方法:
plotfun3 <- function(number) {
plotdata <- testdata
plotdata$group <- factor(plotdata$group, levels …Run Code Online (Sandbox Code Playgroud) 承认,这个问题不是很有趣,但是由于sas-log中的警告可能非常有用,有时候我想知道这里发生了什么.
考虑以下最小的例子.在第0步中,我们创建了一个数据集.在步骤1中,我们想要将步骤0中某个变量的值复制到step1,但是我们忘记了变量的正确名称(或者我们没记错,但是当我们离开时有人更改了它.)我写了两个版本的step1,命名为step1a和step1b .
Data step0;
Dog = 1;
run;
Data step1a;
value = cat;
run;
Data step1b;
array animals cat;
value = animals[1];
run;
Run Code Online (Sandbox Code Playgroud)
不用说,step1的两个版本都生成相同的数据集,在这种情况下是一个带有变量'value'和'cat'的空数据集.
但是:当编写step1a的方式运行step1时,SASlog会警告我们出错了:
NOTE: Variable cat is uninitialized.
Run Code Online (Sandbox Code Playgroud)
我们可以回到我们的代码,注意我们认为猫是一直是一只狗,看到我们的方式的错误,并产生我们想到的正确的数据集.
另一方面,当编写step1b的方式运行step1时,SASlog将表现得好像一切都很好,我们可以在街上唱歌跳舞,只是为了发现多年后狗的价值永远消失.
所以问题是:为什么SAS在第二种情况下认为不需要警告?
通常我想知道神秘错误来自哪里,但现在我的问题是神秘的错误来自何处.
让
numbers <- c(1, 2, 3)
frame <- as.data.frame(numbers)
Run Code Online (Sandbox Code Playgroud)
如果我输入
subset(numbers, )
Run Code Online (Sandbox Code Playgroud)
(所以我想拿一些子集但忘记指定子集函数的subset-argument)然后R提醒我(应该这样):
subset.default(numbers,)出错:
缺少参数"subset",没有默认值
但是当我打字的时候
subset(frame,)
Run Code Online (Sandbox Code Playgroud)
(所以用一个data.frame而不是向量的东西),它不会给出错误,而只是返回(完整)数据帧.
这里发生了什么?为什么我得不到我应得的错误信息?
我不小心发现了R base 中的as.integer或det函数的一个奇怪的错误。有谁知道这里发生了什么以及如何防止它?
我正在计算以下 3×3 矩阵的行列式:
mat <- matrix(c(15, 6, 116, 10, 13, 16, 14, 23, 56), ncol = 3)
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
[,1] [,2] [,3]
[1,] 15 10 14
[2,] 6 13 23
[3,] 116 16 56
Run Code Online (Sandbox Code Playgroud)
两件事很容易看出:所有条目都是整数,并且六组三个条目中的每一个都包含至少一个偶数. 因此行列式必须是偶数。
通过键入det(mat)它来询问 R 这个行列式的实际值,它返回一个看起来像偶数的东西:8952。但是瞧瞧:在 R 的内心深处,它实际上是一个非整数或奇数整数,因为在键入时as.integer(det(mat))我们会得到8951.
这里发生了什么?8951显然是错误的。此外,不太明显的是,值 8952 是正确的,如用笔和纸所见。
所以我的问题是:
这里发生了什么?
当被要求计算整数矩阵的行列式时,如何强制 R 给我正确的整数值?
我下载了新版本的 knitr 包,当尝试在 Rnw 文件中包含绘图时突然出现以下错误:
Error in options[[sprintf("fig.%s", i)]] * options$dpi :
non-numeric argument to binary operator
Calls: knit ... process_group.block -> call_block -> fix_options -> %n%
Run Code Online (Sandbox Code Playgroud)
经过大量实验后,我发现问题出在命令 Fig.height 上,显然它应该是数字。此代码产生错误:
\documentclass{article}
\begin{document}
<<cat, fig.cap="dog", fig.height='\\textheight'>>=
plot(c(1, 2, 3), c(2, 1, 3))
@
\end{document}
Run Code Online (Sandbox Code Playgroud)
这段代码没有:
\documentclass{article}
\begin{document}
<<cat, fig.cap="dog", fig.height=6>>=
plot(c(1, 2, 3), c(2, 1, 3))
@
\end{document}
Run Code Online (Sandbox Code Playgroud)
不幸的是我不知道这个 6 的测量单位是什么。
这段代码:
\documentclass{article}
\begin{document}
<<cat, fig.cap="dog", fig.height=6cm>>=
plot(c(1, 2, 3), c(2, 1, 3))
@
\end{document}
Run Code Online (Sandbox Code Playgroud)
产生不同的错误:
Error in base::parse(text = code, …Run Code Online (Sandbox Code Playgroud)