假设我有一些看起来像这样的计数数据:
library(tidyr)
library(dplyr)
X.raw <- data.frame(
x = as.factor(c("A", "A", "A", "B", "B", "B")),
y = as.factor(c("i", "ii", "ii", "i", "i", "i")),
z = 1:6)
X.raw
# x y z
# 1 A i 1
# 2 A ii 2
# 3 A ii 3
# 4 B i 4
# 5 B i 5
# 6 B i 6
Run Code Online (Sandbox Code Playgroud)
我想像这样整理和总结:
X.tidy <- X.raw %>% group_by(x,y) %>% summarise(count=sum(z))
X.tidy
# Source: local data frame [3 x 3]
# Groups: x …Run Code Online (Sandbox Code Playgroud) 我最近一直在gsub广泛使用,我注意到短模式比长模式运行得更快,这并不奇怪.这是一个完全可重现的代码:
library(microbenchmark)
set.seed(12345)
n = 0
rpt = seq(20, 1461, 20)
msecFF = numeric(length(rpt))
msecFT = numeric(length(rpt))
inp = rep("aaaaaaaaaa",15000)
for (i in rpt) {
n = n + 1
print(n)
patt = paste(rep("a", rpt[n]), collapse = "")
#time = microbenchmark(func(count[1:10000,12], patt, "b"), times = 10)
timeFF = microbenchmark(gsub(patt, "b", inp, fixed=F), times = 10)
msecFF[n] = mean(timeFF$time)/1000000.
timeFT = microbenchmark(gsub(patt, "b", inp, fixed=T), times = 10)
msecFT[n] = mean(timeFT$time)/1000000.
}
library(ggplot2)
library(grid)
library(gridExtra)
axis(1,at=seq(0,1000,200),labels=T)
p1 = qplot(rpt, …Run Code Online (Sandbox Code Playgroud) 以下代码无法正常工作:
a <- list(0, 1)
b <- list(0, 1)
# return a linear function with slope `a` and intercept `b`.
f <- function(a, b) function(x) a*x + b
# create a list of functions with different parameters.
fs <- mapply(f, a, b)
# test
fs[[1]](3)
# [1] 4 # expected zero!
fs[[2]](3)
# [1] 4
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么?
注意:我找到了一个解决方法,所以我不是在寻找一种不同的方法来达到预期的效果.但我很好奇为什么这种特殊方法不起作用.
更新:
从R 3.2.0开始,现在按预期工作:
a <- list(0, 1)
b <- list(0, 1)
f <- function(a, b) function(x) a*x + b
fs <- mapply(f, a, …Run Code Online (Sandbox Code Playgroud) 为什么以下工作在R?
> `:=` <- function(x, y) x + y
> 1 := 2
[1] 3
Run Code Online (Sandbox Code Playgroud)
我的理解是,%用户定义的中缀运算符是必需的.是否有其他(可能更容易打字)选项?
我正在进行模拟研究,需要处理并保存几个文本文件的结果.我以这样的方式组织数据,其中有子目录,并且在每个子目录中,我需要处理并获得1000个数据文件的单独结果.使用宏在SAS中很容易做到这一点.但是,我是R的新手,无法弄清楚如何做到这一点.以下是我想要完成的事情.
DATA Folder-> DC1 -> DC1R1.txt ... DC1R1000.txt
DC2 -> DC2R1.txt ... DC2R1000.txt
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
我在RcppEigen中编写了一些代码,我在文档中遇到了这个不祥的警告:
当然,必须注意不要在C++代码中修改R对象的内容.建议的做法是始终将映射对象声明为const.
这指的是"映射"矩阵,即Eigen中使用与相应R对象相同的存储器的矩阵.
这个警告是关于良好的函数式编程实践,还是有其他事情可以出错,如果我使用映射对象进行就地修改?
这是我在Rcpp中所做的简化版本:
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
void modify(Eigen::Map<Eigen::MatrixXd> X) {
X(0,0) = 0;
return;
}
Run Code Online (Sandbox Code Playgroud)
在R中这样的事情是这样的:
X <- matrix(1:4, 2) + 0
X
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
modify(X)
X
# [,1] [,2]
# [1,] 0 3
# [2,] 2 4
Run Code Online (Sandbox Code Playgroud)
对于我正在研究的特定问题,我通过修改我的矩阵来提高5倍的速度,所以我已经准备好在可读性和可维护性方面做出小小的牺牲.据我所知,它可以按预期工作,但我担心将来某个时候我会邀请某种微妙的bug.
我定义了一个名为的函数once如下:
once <- function(x, value) {
xname <- deparse(substitute(x))
if(!exists(xname)) {
assign(xname, value, env=parent.frame())
}
invisible()
}
Run Code Online (Sandbox Code Playgroud)
这个想法是value评估时间很长,我只想x在第一次运行脚本时将其分配.
> z
Error: object 'z' not found
> once(z, 3)
> z
[1] 3
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢使用once(x) <- value而不是once(x, value),但是如果我编写一个函数once<-,那么变量就不存在了:
> once(z) <- 3
Error in once(z) <- 3 : object 'z' not found
Run Code Online (Sandbox Code Playgroud)
有没有人有办法解决这个问题?
ps:是否有一个名称来描述类似once<-或一般的功能f<-?
我有一些看起来像这样的数据:
require(zoo)
X <- rbind(c(date='20111001', fmt='%Y%m%d'),
c('20111031', '%Y%m%d'),
c('201110', '%Y%m'),
c('102011', '%m%Y'),
c('31/10/2011', '%d/%m/%Y'),
c('20111000', '%Y%m%d'))
print(X)
# date fmt
# [1,] "20111001" "%Y%m%d"
# [2,] "20111031" "%Y%m%d"
# [3,] "201110" "%Y%m"
# [4,] "102011" "%m%Y"
# [5,] "31/10/2011" "%d/%m/%Y"
# [6,] "20111000" "%Y%m%d"
Run Code Online (Sandbox Code Playgroud)
我只想要年月.我不需要这一天,所以我不担心最后一天是无效的.不幸的是,R是:
mapply(as.yearmon, X[, 'date'], X[, 'fmt'], SIMPLIFY=FALSE)
# $`20111001`
# [1] "Oct 2011"
# $`20111031`
# [1] "Oct 2011"
# $`201110`
# [1] "Oct 2011"
# $`102011`
# [1] "Oct 2011"
# $`31/10/2011`
# [1] "Oct …Run Code Online (Sandbox Code Playgroud) 我有一个由混合数据类型(数字,字符,因子,序数因子)组成的大型数据库,缺少值,我试图创建一个for循环,使用相应列的平均值替换缺失值,如果数字或字符/因子的模式.
这就是我现在所拥有的:
#fake array:
age<- c(5,8,10,12,NA)
a <- factor(c("aa", "bb", NA, "cc", "cc"))
b <- c("banana", "apple", "pear", "grape", NA)
df_test <- data.frame(age=age, a=a, b=b)
df_test$b <- as.character(df_test$b)
for (var in 1:ncol(df_test)) {
if (class(df_test[,var])=="numeric") {
df_test[is.na(df_test[,var]) <- mean(df_test[,var], na.rm = TRUE)
} else if (class(df_test[,var]=="character") {
Mode(df_test$var[is.na(df_test$var)], na.rm = TRUE)
}
}
Run Code Online (Sandbox Code Playgroud)
"模式"的功能是:
Mode <- function (x, na.rm) {
xtab <- table(x)
xmode <- names(which(xtab == max(xtab)))
if (length(xmode) > 1)
xmode <- ">1 mode"
return(xmode)
}
Run Code Online (Sandbox Code Playgroud)
它似乎只是忽略了语句,没有给出任何错误......我也尝试用索引来处理第一部分:
## …Run Code Online (Sandbox Code Playgroud) 我想测试我的一个函数给出了一个特定的消息(或警告或错误).
good <- function() message("Hello")
bad <- function() message("Hello!!!!!")
Run Code Online (Sandbox Code Playgroud)
我希望第一个期望成功,第二个期望失败.
library(testthat)
expect_message(good(), "Hello", fixed=TRUE)
expect_message(bad(), "Hello", fixed=TRUE)
Run Code Online (Sandbox Code Playgroud)
不幸的是,他们两个目前都在通过.
为了澄清:这是一个最小的例子,而不是我正在测试的确切消息.如果可能的话,我希望避免为我的测试脚本添加复杂性(可能还有错误),因为需要为我要测试的每个新消息提供一个合适的正则表达式.