我对R中的switch语句有点困惑.只需在googling函数中我得到一个例子,如下所示:
switch的一个常见用途是根据函数的一个参数的字符值进行分支.
> centre <- function(x, type) {
+ switch(type,
+ mean = mean(x),
+ median = median(x),
+ trimmed = mean(x, trim = .1))
+ }
> x <- rcauchy(10)
> centre(x, "mean")
[1] 0.8760325
> centre(x, "median")
[1] 0.5360891
> centre(x, "trimmed")
[1] 0.6086504
Run Code Online (Sandbox Code Playgroud)
然而,这似乎只是if为每个指定了一堆语句type
这就是全部switch()吗?有人可以给我更多的例子和更好的应用吗?
当我制作盒子图时,我也喜欢在后台显示原始数据,如下所示:
library(ggplot2)
library(RColorBrewer)
cols = brewer.pal(9, 'Set1')
n=10000
dat = data.frame(value=rnorm(n, 1:4), group=factor(1:4))
ggplot(dat, aes(x=group, y=value, color=group, group=group)) +
geom_point(position=position_jitter(width=0.3), alpha=0.1) +
scale_color_manual(values=cols) +
geom_boxplot(fill=0, outlier.size=0)
Run Code Online (Sandbox Code Playgroud)

但是,我不喜欢它当点太密集时我的盒子图完全消失了.我知道我可以调整alpha,这在某些情况下很好,但是当我的团队密度不同时(例如,如果我减少alpha到最轻的组会完全消失,以便最暗的组不会遮挡框图) .我正在尝试做的是系统地改变箱形图的颜色 - 可能有点暗 - 这样即使背景点最大化了alpha,它们也会出现.例如:
plot(1:9, rep(1, 9), pch=19, cex=2, col=cols)
cols_dk = rgb2hsv(col2rgb(brewer.pal(9, 'Set1'))) - c(0, 0, 0.2)
cols_dk = hsv(cols_dk[1,], cols_dk[2,], cols_dk[3,])
points(1:9, rep(1.2, 9), pch=19, cex=2, col=cols_dk)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还没有找到一种方法来伪造一个不同scale_color的geom_boxplot层(如果有办法,这似乎是最简单的路线).我也没有能够找到一种简单的语法来系统地调整颜色,就像你可以轻松地抵消连续美学一样aes(x=x+1).
我能得到的最接近的是完全复制因子的水平......
ggplot(dat, aes(x=group, y=value, color=group, group=group)) +
geom_point(position=position_jitter(width=0.3), alpha=0.1) +
scale_color_manual(values=c(cols[1:4], cols_dk[1:4])) …Run Code Online (Sandbox Code Playgroud) 我有兴趣测试SVM性能,将几个人分为四组/每组.当使用MATLAB中的svmtrain LibSVM函数时,我能够根据该等式的值得到用于对这4个组中的个体进行分类的三个方程式.计划如下:
All individuals (N)*
|
Group 1 (n1) <--- equation 1 ---> (N-n1)
|
(N-n1-n2) <--- equation 2 ---> Group 2 (n2)
|
Group 3 (n3) <--- equation 3 ---> Group 4(n4)
*N = n1+n2+n3+n4
Run Code Online (Sandbox Code Playgroud)
有没有办法在e1071 R包中使用svm函数来获得这些方程式?
我正在越来越多地使用Rscript,我通常会使用bash脚本.一个小烦恼是,许多这些脚本循环一些system()调用,如果我试图中断它,R基本上没有时间来捕获我的控制-c.相反,它只是中止正在运行的系统命令并继续下一个循环迭代.例如,当我尝试通过按住control-c来中断以下操作时,它仍然会通过所有迭代:
for(i in 1:10) {
cat(i)
system('sleep 3')
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我总是通过在每个循环中插入一个小暂停来解决这个问题
for(i in 1:10) {
Sys.sleep(0.25)
cat(i)
system('sleep 3')
}
Run Code Online (Sandbox Code Playgroud)
如果我按住control-c,这将让我在一两次迭代中中止,但我想知道,有没有更有效的方法来实现这种行为?
我有一些数据显示几何关系,但有异常值.例如:
x = seq(0.1, 1, 0.01)
dat = data.frame(x=x, y=10^x)
dat[50:60, 2] = 10
qplot(x, y, data=dat, geom='line')
Run Code Online (Sandbox Code Playgroud)

我想使用对数变换绘制它,同时放大部分数据.我知道我可以用第一部分coord_trans(y='log10')或第二部分来做coord_cartesian(ylim=c(2,8)),但是我无法将它们组合起来.此外,我需要保持这些点,所以简单地剪切它们scale_y_continuous(limits=c(2,8))对我不起作用.
有没有办法实现这一点,而不必采取以下可怕的黑客攻击?也许是一种无法通过限制的无证方式coord_trans?
pow10 <- function(x) as.character(10^x)
qplot(x, log10(y), data=dat, geom='line') +
scale_y_continuous(breaks=log10(seq(2,8,2)), formatter='pow10') +
coord_cartesian(ylim=log10(c(2,8)))
Run Code Online (Sandbox Code Playgroud)

是否可以执行以下操作:
loc1 <- c("Aa", "Aa", "aa", "Aa")
loc2 <- c("aa", "aa", "aa", "AA")
loc3 <- c("aa", "Aa", "aa", "aa")
gen <- data.frame(loc1, loc2, loc3)
loc1g <- c(0.01, 0.5, 1, 0.75)
loc2g <- c(0.2, 0.1, 0.2, 0.6)
loc3g <- c(0.8, 0.8, 0.55, 1)
pval <- data.frame(loc1g, loc2g, loc3g)
Run Code Online (Sandbox Code Playgroud)
我想打印到文件到gen数据帧,这是由pval数据帧有条件地格式化的.比颜色(row1,col1)的平均值取决于pvale(row1,col1).以下是颜色编码:
0 to 0.3 is "red" text color
0.31 to 0.7 is "yellow"
> 0.7 is "red"
Run Code Online (Sandbox Code Playgroud)
gen [1,1]将以红色文字颜色打印"Aa"等等....
感谢你的帮助.
EDITS:
我更感兴趣的是打印而不是绘图.如果我可以将输出保存为MS excel并在MSEXCEL中打开它会很棒.我也可以是其他类型的文本编辑器格式,可以读取彩色编码文本.由于我的原始数据矩阵的尺寸应为1000 x 1000甚至更大.我想快速了解每个gen类别的p值.
我想做SQL的GROUP BY在MATLAB中做的事情.例如,
M = [
1,5;
2,5;
3,5;
1,6;
2,6;
1,7]
SQL:SELECT MAX(c1),c2 FROM M(c1,c2)GROUP BY 2
结果= [
3,5;
2,6;
1,7]
我怎样才能在Matlab中做到这一点?
在没有显示的情况下以批处理模式运行MATLAB(例如,未设置$DISPLAYUNIX环境变量,或matlab -nodisplay启动时使用标志),通常不能使用opengl渲染器.相反,你必须满足于painters渲染器.例如:
>> print -dpng -opengl fig.png
Warning: OpenGL mode can not be used in terminal emulation mode; ignoring option.
Run Code Online (Sandbox Code Playgroud)
不幸的是,painters在处理具有补丁,光照,透明度等的3D场景时,往往效果不佳.这是一个简单的例子(现在使用显示),其中alpha丢失:
peaks
alpha(0.5)
print -dpng -opengl peaks_opengl.png
print -dpng -painters peaks_painters.png
Run Code Online (Sandbox Code Playgroud)

由于这些限制,我感到非常兴奋的发现大多-无证hardcopy()内置MATLAB函数,它不以某种方式让你使用opengl渲染器没有显示.这个功能是很棒的export_fig()功能的基础.现在,我能够以批处理模式快速保存高质量的3D数字.
但是,有一个问题:当图形通过hardcopy()函数时,所有文本都会丢失.例如:
plot(1,1)
title('TEST')
Run Code Online (Sandbox Code Playgroud)
>> A = hardcopy(gcf, '-Dopengl', '-r300');
Warning: Failed to draw text string
> In /Applications/MATLAB_R2010b.app/toolbox/matlab/graphics/hardcopy.p>hardcopy at 21
Run Code Online (Sandbox Code Playgroud)
输出数字完全没有任何文本(没有轴标记标签,没有标题):
export_fig axis.png -opengl
Run Code Online (Sandbox Code Playgroud)

所以我想知道的是:如何让 …
在R中有没有办法比较对象并返回有用的东西,比如差异在哪里?我需要比较文件,但我愿意将它们读入data.frames.这可能只是从命令行处理得更好,但我想将我的测试封装到一个R脚本中.我的下一次尝试是使用ddply将每一行发送到compare()函数并返回"FALSE"行的行号,但这只有在你有一次插入或删除时才有效,然后其他所有行都变为"FALSE".
谢谢.
编辑:文件包含数字和字符数据的组合.
我是R的新手,所以请原谅我这是一个非常基本的问题.
我写了一个R脚本,它做了一些计算,并在最后绘制了Box Plot.如果我从R控制台运行此脚本,它运行正常并绘制图形.
如果我从Java程序(JRI站点上给出的示例rtest.java程序)运行脚本,则计算结果很好.但绘制图表存在一些问题.框架窗口打开并保持忙碌并挂起.(如果我尝试单击窗口,则显示"无响应".)我正在使用JRI.
这就是我在脚本中绘制图形的方式:
boxplot(mat);
Run Code Online (Sandbox Code Playgroud)
以上命令在R控制台上正常工作.
我很确定这是关于某些导入/包或类似的设置.但无法弄清楚到底是什么.
谁能帮我这个?
谢谢.
编辑1: 我的盒子绘图命令的输出:

在John提供的链接上输出此代码:

我有一个如下所示的数据集:
id factor H1 H2 H3 H4 H5 H6
434543 lev3 0.8 0.7 0.7 0.5 0.6 0.8
434544 lev2 0.5 0.7 0.9 0.7 0.7 0.1
434545 lev3 0.7 0.7 0.8 0.5 0.7 0.7
434546 lev2 0.4 0.6 0.5 0.8 0.7 0.2
434547 lev3 0.6 0.7 0.8 0.8 0.8 0.7
434548 lev2 0.7 0.7 0.6 0.7 0.8 0.4
434549 lev2 0.8 0.8 0.8 0.7 0.6 0.5
434550 lev1 0.3 0.3 0.4 0.3 0.4 0.5
434551 lev1 0.0 0.3 0.4 0.3 0.2 …Run Code Online (Sandbox Code Playgroud) 我主要使用R,但最终想使用Rcpp与一些C++函数接口,这些函数接收并返回2d数字数组.因此,为了开始使用C++和Rcpp,我想我只是做了一个小函数,将我的可变长度数字向量的R列表转换为C++等价物并再次返回.
require(inline)
require(Rcpp)
test1 = cxxfunction(signature(x='List'), body =
'
using namespace std;
List xlist(x);
int xlen = xlist.size();
vector< vector<int> > xx;
for(int i=0; i<xlen; i++) {
vector<int> test = as<vector<int> > (xlist[i]);
xx.push_back(test);
}
return(wrap(xx));
'
, plugin='Rcpp')
Run Code Online (Sandbox Code Playgroud)
这就像我期望的那样:
> test1(list(1:2, 4:6))
[[1]]
[1] 1 2
[[2]]
[1] 4 5 6
Run Code Online (Sandbox Code Playgroud)
不可否认,我只是通过非常详尽的文档的一部分,但有没有更好的(即更像Rcpp)方式进行R - > C++转换而不是for循环?我想可能不是,因为文档提到(至少使用内置方法)as"提供较少的灵活性,并且当前处理R对象转换为原始类型",但我想检查,因为我非常新手在这方面.