小编pet*_*ete的帖子

在tidyr/dplyr中添加零计数行的正确习惯用法

假设我有一些看起来像这样的计数数据:

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)

r dplyr tidyr

33
推荐指数
2
解决办法
1万
查看次数

gsub速度与模式长度

我最近一直在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)

regex string r gsub stringi

26
推荐指数
1
解决办法
940
查看次数

奇怪的mapply行为:我错过了什么?

以下代码无法正常工作:

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

16
推荐指数
2
解决办法
574
查看次数

为什么`:=`作为中缀运算符?

为什么以下工作在R?

> `:=` <- function(x, y) x + y
> 1 := 2
[1] 3
Run Code Online (Sandbox Code Playgroud)

我的理解是,%用户定义的中缀运算符是必需的.是否有其他(可能更容易打字)选项?

syntax r

11
推荐指数
1
解决办法
349
查看次数

如何从多个目录中读取多个文件到R中进行处理?

我正在进行模拟研究,需要处理并保存几个文本文件的结果.我以这样的方式组织数据,其中有子目录,并且在每个子目录中,我需要处理并获得1000个数据文件的单独结果.使用宏在SAS中很容易做到这一点.但是,我是R的新手,无法弄清楚如何做到这一点.以下是我想要完成的事情.

DATA Folder-> DC1 -> DC1R1.txt ... DC1R1000.txt
              DC2 -> DC2R1.txt ... DC2R1000.txt
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

r batch-file

7
推荐指数
3
解决办法
9379
查看次数

可以修改RcppEigen中的映射矩阵吗?

我在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.

r rcpp

5
推荐指数
1
解决办法
286
查看次数

如何使用替换功能创建自定义分配?

我定义了一个名为的函数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<-

r

4
推荐指数
2
解决办法
741
查看次数

如果没有自己修理一天,如何在一天无效的情况下获得年份和月份?

我有一些看起来像这样的数据:

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)

r date

4
推荐指数
1
解决办法
276
查看次数

替换R中缺失值的平均值或模式

我有一个由混合数据类型(数字,字符,因子,序数因子)组成的大型数据库,缺少值,我试图创建一个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)

r missing-data

3
推荐指数
1
解决办法
1万
查看次数

在testthat中测试精确的字符串

我想测试我的一个函数给出了一个特定的消息(或警告或错误).

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)

不幸的是,他们两个目前都在通过.

为了澄清:这是一个最小的例子,而不是我正在测试的确切消息.如果可能的话,我希望避免为我的测试脚本添加复杂性(可能还有错误),因为需要为我要测试的每个新消息提供一个合适的正则表达式.

r testthat

2
推荐指数
1
解决办法
424
查看次数

标签 统计

r ×10

batch-file ×1

date ×1

dplyr ×1

gsub ×1

missing-data ×1

rcpp ×1

regex ×1

string ×1

stringi ×1

syntax ×1

testthat ×1

tidyr ×1