最近我了解到我可以使用identical或all.equal检查2个数据集是否相同.
我还可以用它们来检查2个R程序是否相同吗?有比下面更好或更合适的方式吗?
program.1 <- readLines("c:/r stuff/test program 1.r")
program.2 <- readLines("c:/r stuff/test program 2.r")
identical(program.1, program.2)
all.equal(program.1, program.2)
isTRUE(all.equal(program.1, program.2))
Run Code Online (Sandbox Code Playgroud)
感谢您的任何想法或建议.
以下是比较的2个测试程序的内容:
a <- matrix(2, nrow=3, ncol=4)
b <- c(1,2,3,4,5,6,7,8,6,5,4,3,2)
table(b)
c <- runif(2,0,1)
a * b
Run Code Online (Sandbox Code Playgroud)
#2012年3月编辑从这里开始#
下面是一个小例子程序使下述收益约什的功能FALSE,而identical和all.equal回报TRUE.我将两个程序文件命名为'testa.r'和'testb.r'.
set.seed(123)
y <- rep(NA, 10)
s <- matrix(ceiling(runif(10,0,100)), nrow=10, byrow=T)
a <- 25
ab <- 50
abc <- 75
for(i in 1:10) {
if(s[i] > a & s[i] <= …Run Code Online (Sandbox Code Playgroud) 我有一个我可能会阅读的文本数据文件readLines.每个字符串的初始部分包含大量的乱码,然后是我需要的数据.乱码和数据通常由三个点分隔.我想在最后三个点之后拆分字符串,或者用某种标记替换最后三个点,告诉R将这三个点左边的所有内容都当作一列.
这是Stackoverflow上的一个类似帖子,它将找到最后一个点:
但是,在我的情况下,一些数据有小数,所以找到最后一个点是不够的.另外,我认为...R中有一个特殊的含义,这可能会使问题复杂化.另一个潜在的复杂因素是一些点比其他点大.此外,在某些行中,三个点中的一个用逗号替换.
除了gregexpr在上面的帖子我尝试过使用gsub,但无法弄清楚解决方案.
这是一个示例数据集和我希望实现的结果:
aa = matrix(c(
'first string of junk... 0.2 0 1',
'next string ........2 0 2',
'%%%... ! 1959 ... 0 3 3',
'year .. 2 .,. 7 6 5',
'this_string is . not fine .•. 4 2 3'),
nrow=5, byrow=TRUE,
dimnames = list(NULL, c("C1")))
aa <- as.data.frame(aa, stringsAsFactors=F)
aa
# desired result
# C1 C2 C3 C4
# 1 first string of junk 0.2 0 1 …Run Code Online (Sandbox Code Playgroud) 是否可以使用write.table格式化输出?
我可以使用tab来左对齐列sep = '\t',并且可以使用两个选项卡增加列之间的间距sep = '\t\t'.
理想情况下,我希望能够右对齐列并使用中间数量的间距,而不是'\ t'和'\ t\t'提供的间距.使用类似的东西会sep = '\t '破坏列对齐.
我必须证明从使用多种不同表格格式的许多不同文件中提取的大量数据.将R的输出文本文件的列间距与原始pdf文档中的列间距紧密匹配将大大提高校对的速度和准确性.
# example data to write to text file
aa = matrix(c(1000,110,10,1,
0,2000,20,2,
30,300,3000,30000), nrow=3, byrow=TRUE,
dimnames = list(NULL, c("C1", "C2", "C3","C4")))
aa
# left align columns using a tab
write.table(aa,file="c:/users/mark w miller/simple r programs/formatted_tablea.txt", na = 'NA', sep = '\t',
row.names = F, col.names = F)
# 1000 110 10 1
# 0 2000 20 2
# 30 300 3000 30000 …Run Code Online (Sandbox Code Playgroud) 我有一个按区域随时间变化的计数数据框。数据框的一行包含每列的计数总计。我想通过将每个列单元格除以相应列的计数总计,将数据框从计数转换为比例。有些列包含缺失的观察结果。我在下面使用嵌套完成了此操作for-loops,但怀疑可能有更简单的方法,也许使用lapply. 我在提取计数总计行时也遇到了麻烦。
我发布此内容的部分原因是,现在是我学习使用 apply 函数系列的时候了,我怀疑它们在这里可能有用,部分原因是我在创建计数总数向量时遇到了很多麻烦,并且怀疑使用它们会有所[[帮助。感谢您提供有关更有效地编写上述代码的任何建议。
my.data = read.table(text = "
state y1970 y1980 y1990 y2000
Alaska 4 6 NA 7
Iowa 10 20 30 40
Nevada 100 100 100 100
Ohio 50 60 NA 80
total 172 195 215 238
Wyoming 8 9 10 11
", sep = "", header = TRUE)
desired.result = read.table(text = "
state y1970 y1980 y1990 y2000
Alaska 0.02325581 0.03076923 NA 0.02941176
Iowa 0.05813953 0.10256410 0.13953488 0.16806723
Nevada 0.58139535 …Run Code Online (Sandbox Code Playgroud) 我想将一个4维数组转换成一个二维数据集.我提出了两种方法的代码:一种方法使用暴力方法涉及cbind和rbind第二种方法使用嵌套for-loops.不过,我认为可能有更好的方法.谢谢你的任何建议.
R <- 3 # regions
M <- 5 # sites
J <- 2 # samples
T <- 4 # years
# 4-dim example array
y <- array(NA, dim = c(M, J, T, R))
# region 1
y[,1,1,1] = 1; y[,2,1,1] = 2;
y[,1,2,1] = 3; y[,2,2,1] = 4;
y[,1,3,1] = 5; y[,2,3,1] = 6;
y[,1,4,1] = 7; y[,2,4,1] = 8;
# region 2
y[,1,1,2] = 9; y[,2,1,2] = 10;
y[,1,2,2] = 11; y[,2,2,2] …Run Code Online (Sandbox Code Playgroud) 我想定期拆分一个字符串.我的问题几乎与这个问题相同:如何将字符串拆分为给定长度的子字符串?除了我在数据集中有一列字符串而不是一个字符串.
这是一个示例数据集:
df = read.table(text = "
my.id X1
010101 1
010102 1
010103 1
010104 1
020101 1
020112 1
021701 0
021802 0
133301 0
133302 0
241114 0
241215 0
", header = TRUE, colClasses=c('character', 'numeric'), stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
这是期望的结果.我更愿意删除前导零,如图所示:
desired.result = read.table(text = "
A1 A2 A3 X1
1 1 1 1
1 1 2 1
1 1 3 1
1 1 4 1
2 1 1 1
2 1 12 1
2 17 …Run Code Online (Sandbox Code Playgroud) 我想删除字符串中的字母,但保护特定的单词.这是一个例子:
my.string <- "Water the 12 gold marigolds please, but not the 45 trees!"
desired.result <- "12 marigolds, 45 trees"
Run Code Online (Sandbox Code Playgroud)
我尝试了下面的代码,结果令人惊讶.我认为()会保护它所包含的一切.相反,恰恰相反.只()删除了内部的单词(加上!).
gsub("(marigolds|trees)\\D", "", my.string)
# [1] "Water the 12 gold please, but not the 45 "
Run Code Online (Sandbox Code Playgroud)
以下是一个较长字符串的示例:
my.string <- "Water the 12 gold marigolds please, but not the 45 trees!, The 7 orange marigolds are fine."
desired.result <- "12 marigolds, 45 trees, 7 marigolds"
gsub("(marigolds|trees)\\D", "", my.string)
Run Code Online (Sandbox Code Playgroud)
返回:
[1] "Water the 12 gold please, …Run Code Online (Sandbox Code Playgroud) 我有两个向量a = c(1,2,3),b = c(1,2,3)
我想测试是否a完全相同b.我知道结果可以给出sum(a == b) == length(a),但有没有优雅的方式?
我正在尝试安装Cygwin作为gcc 6.3.0在Windows 1064 位机器上安装的前兆。我正在按照我在此处找到的说明进行操作。
当我使用以下行安装Cygwin软件包时(上述链接中的第 2 步):
C:\cygwin64>setup-x86_64.exe -q -P wget -P gcc-g++ -P make -P diffutils -P libmpfr-devel -P libgmp-devel -P libmpc-devel
Run Code Online (Sandbox Code Playgroud)
我在 Windows 命令窗口中收到以下消息:
C:\cygwin64>note: Hand installation over to elevated child process.
_
Run Code Online (Sandbox Code Playgroud)
如上图所示,光标位于Cin下方C:\cygwin64并闪烁。就这样保持了大约一个小时。
这是否仅仅意味着计算机需要很长时间来安装Cygwin软件包。或者这是否意味着Cygwin安装失败,我需要尝试其他方法?还是计算机正在等待我从键盘在 Windows 命令窗口中输入内容?如果是第三种可能性,我应该输入什么?
上面链接中的说明似乎非常详尽,但没有提及此消息。我也无法通过搜索互联网找到任何建议。说明还建议安装可能只需 15 分钟。所以,等了一个小时后,我想有什么问题。
谢谢你的任何建议。
附注。
我确实在这里找到了一条消息。
这种似乎表明Cygwin安装成功:
if the elevation was successful. In that case the stdout log now …Run Code Online (Sandbox Code Playgroud) 我希望创建一个从一个到另一个vector的职位。这类似于以下问题:elementsvectorvector
matchbase 中的函数在R最简单的情况下工作,如下所示:
a <- c(1,1,2,2,3,3,4,4,5,5)
b <- c(1,2,3,4,5)
desired.output <- c(1,3,5,7,9)
match(b,a)
#[1] 1 3 5 7 9
Run Code Online (Sandbox Code Playgroud)
但是,match在如下所示的更复杂的情况下似乎不起作用。which我可能需要和的组合match。到目前为止,在我考虑的每种情况下, 中的值b出现的频率并不b比 中出现的频率高a。我需要一个基本R解决方案。
a <- c(1,1,2,2,3,3,4,4,5,5)
b <- c(1,2,2,3,4,5)
desired.output <- c(1,3,4,5,7,9)
a <- c(1,1,2,2,3,3,4,4,5,5)
b <- c(1,2,2,3,4,4,5)
desired.output <- c(1,3,4,5,7,8,9)
a <- c(1,1,2,2,3,3,4,4,5,5)
b <- c(1,2,2,3,4,4,5,5)
desired.output <- c(1,3,4,5,7,8,9,10)
a <- c(1,1,2,2,3,3,4,4,5,5)
b <- …Run Code Online (Sandbox Code Playgroud)