小编Spa*_*man的帖子

在dplyr mutate调用中添加多个列

我有一个带点分隔字符列的数据框:

> set.seed(310366)
> tst = data.frame(x=1:10,y=paste(sample(c("FOO","BAR","BAZ"),10,TRUE),".",sample(c("foo","bar","baz"),10,TRUE),sep=""))
> tst
    x       y
1   1 BAR.baz
2   2 FOO.foo
3   3 BAZ.baz
4   4 BAZ.foo
5   5 BAZ.bar
6   6 FOO.baz
7   7 BAR.bar
8   8 BAZ.baz
Run Code Online (Sandbox Code Playgroud)

我想将该列拆分为两个新列,其中包含点两侧的部分.str_split_fixed从包中stringr可以很好地完成这项工作.我的所有值肯定是用点分隔的两个部分,所以我可以这样做:

> require(stringr)
> str_split_fixed(tst$y,"\\.",2)
      [,1]  [,2] 
 [1,] "BAR" "baz"
 [2,] "FOO" "foo"
 [3,] "BAZ" "baz"
 [4,] "BAZ" "foo"
 [5,] "BAZ" "bar"
 [6,] "FOO" "baz"
 [7,] "BAR" "bar"
Run Code Online (Sandbox Code Playgroud)

现在我可以把cbind它放到我的数据框架上,但我想我会弄清楚如何在dplyr管道中做到这一点.首先,我认为mutate可以做到一个:

> tst %.% mutate(parts=str_split_fixed(y,"\\.",2))
Error: wrong …
Run Code Online (Sandbox Code Playgroud)

r dplyr

20
推荐指数
1
解决办法
9857
查看次数

将R列表转换为具有missing/NULL元素的数据帧

给出一个清单:

alist = list(
  list(name="Foo",age=22),
  list(name="Bar"),
  list(name="Baz",age=NULL)
 )
Run Code Online (Sandbox Code Playgroud)

什么是将其转换为具有名称和年龄列的数据框的最佳方式,具有缺失值(我将按优先顺序接受NA或"")?

使用ldply失败的简单方法,因为它尝试将每个列表元素转换为数据帧,但是因为长度不匹配而使用NULL barfs的方法.我现在最好的是:

> ldply(alist,function(s){t(data.frame(unlist(s)))})
  name  age
1  Foo   22
2  Bar <NA>
3  Baz <NA>
Run Code Online (Sandbox Code Playgroud)

但这很icky,数字变量成为一个因素......

r list plyr dataframe

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

为R函数编写装饰器

最近一位同事正在研究呼叫图,并希望看到什么叫做什么.我们用mvbutils的foodweb对它进行了排序,但我想知道如何最好地在R中创建一个装饰器(用python说话).所以我这样做了:

instrument=function(z){
  force(z) 
  n=deparse(substitute(z)) # get the name
  f=function(...){
   cat("calling ", n,"\n")
   x=z(...)
   cat("done\n")
   return(x)
   }
  return(f)
}
Run Code Online (Sandbox Code Playgroud)

这让我做:

> foo=function(x,y){x+y}
> foo(1,2)
[1] 3
Run Code Online (Sandbox Code Playgroud)

现在我可以通过包装它来使函数自己记录:

> foo=instrument(foo)
> foo(1,2)
calling  foo
done
[1] 3
Run Code Online (Sandbox Code Playgroud)

以前做过这件事,在一个包裹中说,并且我错过了任何会破坏我这样做的陷阱吗?

r

17
推荐指数
1
解决办法
1501
查看次数

在CouchDB中使用map reduce来输出更少的行

假设您有两种文档类型,客户订单.一个客户文档包含如姓名,地址等和基本信息的订单包含所有的订单信息每次客户订单的东西.存储文档时,type = order或type = customer.

如果我在一组10个客户和30个订单上执行地图功能,它将输出40行.有些行是客户,有些是订单.

问题是,如何编写reduce,以便将订单信息"填充"在具有客户信息的行内?因此它将返回10行(10个客户),但每个客户的所有相关订单.

基本上我不想在输出上单独记录,我想将它们组合在一起(订单分成一个客户行)我觉得减少是这样的吗?

database reduce couchdb join map

14
推荐指数
1
解决办法
2859
查看次数

R的read.csv在第一列名称前加上垃圾文本

我已将数据从SQL Server Management Studio中的结果网格导出到csv文件.csv文件看起来正确.

但是当我使用read.csv将数据读入R数据帧时,第一列名称前缀为" ï.. ".我如何摆脱这个垃圾文本?

例:

str(trainData)

'data.frame':   64169 obs. of  20 variables:    
 $ ï..Column1             : int  3232...   
 $ Column2                : int  4242...
Run Code Online (Sandbox Code Playgroud)

数据看起来像这样(没什么特别的):

Column1,Column2
100116577,100116577
100116698,100116702

byte-order-mark r utf-8

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

获取S3打印方法的对象名称失败

定义S3类"bar"的对象和打印方法:

foo=list(1)
class(foo) <- c("bar")
print.bar <- function(x,...){
  cat("print.bar says this was ",deparse(substitute(x)),"\n")
}
Run Code Online (Sandbox Code Playgroud)

现在print(foo)执行此操作:

> print(foo)
print.bar says this was  foo 
Run Code Online (Sandbox Code Playgroud)

很好,但自动打印失败:

> foo
print.bar says this was  structure(list(1), class = "bar")
Run Code Online (Sandbox Code Playgroud)

我猜这与线被评估为顶级表达式的方式有关.快速搜索R-devel无济于事.谁知道怎么修它?

我想要这个名字的原因是因为我定义的东西是一个函数,我希望能够在print方法中放入'try foo(2)'(从对象名称中获取'foo').是的,您可以在S3中子类化函数.我想可能还有其他的pifalls ..

r r-s3

13
推荐指数
2
解决办法
564
查看次数

如果列中没有日期,则read.xlsx读取日期错误

xlsx包读取日期在错误.我已经在这里阅读了所有顶级类似的Q并且在互联网上有一个侦察员,但如果列中存在非日期数据,我无法找到原点发生变化的特殊行为.

我有一个可以从Dropbox获得的小型Excel电子表格:

https://www.dropbox.com/s/872q9mzb5uzukws/test.xlsx

它有三行,两列.第一个是日期,第二个是数字.第三行在日期列中有"总计".

如果我在前两行读取read.xlsx并告诉它第一列是一个日期,那么这是有效的:

read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"),endRow=2)
          X1 X2
1 2014-06-29 49
2 2014-06-30 46
Run Code Online (Sandbox Code Playgroud)

这些确实是电子表格中的日期.如果我尝试读取所有三行,则会出现问题:

read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"))
          X1    X2
1 2084-06-30    49
2 2084-07-01    46
3       <NA> 89251
Warning message:
In as.POSIXlt.Date(x) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)

如果我尝试以整数读入,我得到不同的整数:

> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"),endRow=2)
     X1 X2
1 16250 49
2 16251 46
> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"))
     X1    X2
1 41819    49
2 41820    46
3    NA 89251
Run Code Online (Sandbox Code Playgroud)

使用as.Date(s1$X1,origin="1970-01-01")(Unix纪元)正确转换第一个整数,并使用as.Date(s2$X1, origin="1899-12-30")(Excel纪元)正确转换第二个整数.如果我使用1970转换第二批我得到2084日期.

那么:我做错了吗?最好是整数读取,如果有任何NA然后使用Excel时代转换,否则使用Unix纪元?或者它是xlsx包中的错误?

xlsx版本是版本:0.5.1

excel r date r-xlsx

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

如何读取R中的MNIST数据库?

我目前正在研究一个案例研究,我需要在MNIST数据库上工作.
站点中的文件称为IDX文件格式.我尝试使用基本的文本编辑器(如记事本和wordpad)来查看这些文件,但没有运气.
期待它们将采用高端格式,我尝试了以下方法:

to.read = file("t10k-images.idx3-ubyte", "rb")
readBin(to.read, integer(), n=100, endian = "high")
Run Code Online (Sandbox Code Playgroud)

我得到了一些数字作为输出,但没有一个对我有任何意义.

任何人都可以解释如何读取R中的MNIST数据库文件以及如何解释这些数字?谢谢.

database file-io r

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

应用于函数向量

给定一个函数的向量(实际上是一个列表):

 fs = c(sin, cos, tan)
Run Code Online (Sandbox Code Playgroud)

和一个值向量:

 xs = c(.1, .3, .5)
Run Code Online (Sandbox Code Playgroud)

是否有更好/更整洁/更快/更强的计算方法fs[[i]](xs[i])为每个向量元素:

 vapply(1:3, FUN.VALUE = 1 ,function(i){fs[[i]](xs[i])})
  [1] 0.09983342 0.95533649 0.54630249
Run Code Online (Sandbox Code Playgroud)

或者我在fapply某个地方错过了一个功能?函数将始终是单个标量值的函数并返回单个标量值.

r

11
推荐指数
2
解决办法
261
查看次数

有哪些替代方法可以在公式中指定二项式成功/试验?

假设您正在对二项式数据进行建模,其中每个响应是来自多个试验(N)的一些成功(y)以及一些解释变量(a和b).有一些函数可以做这种事情,它们似乎都使用不同的方法来指定y和N.

在glm中,你做glm(cbind(y,N-y)~a+b, data = d) (LHS成功/失败的矩阵)

在inla,你做inla(y~a+b, Ntrials=d$N, data=d)(分别指定试验次数)

在glmmBUGS中,你做glmmBUGS(y+N~a+b,data=d)(指定成功+试验作为LHS的条款)

在编写新方法时,我一直认为最好遵循glm所做的,因为人们通常会首先遇到二项式响应数据.但是,我永远不会记得它cbind(y,N-y)或者cbind(y,N)- 我通常似乎在我的数据中有成功/数量的试验而不是成功/失败次数 - YMMV.

当然,其他方法也是可能的.例如,使用RHS上的函数来标记变量是试验次数还是失败次数:

myblm( y ~ a + b + Ntrials(N), data=d)
myblm( y ~ a + b + Nfails(M), data=d)  # if your dataset has succ/fail variables
Run Code Online (Sandbox Code Playgroud)

或定义一个运算符只是做一个cbind,所以你可以这样做:

myblm( y %of% N ~ a + b, data=d)
Run Code Online (Sandbox Code Playgroud)

从而为LHS增添了一些含义,使其明确.

有没有人有更好的想法?这样做的正确方法是什么?

r formula

10
推荐指数
1
解决办法
1017
查看次数

标签 统计

r ×9

database ×2

byte-order-mark ×1

couchdb ×1

dataframe ×1

date ×1

dplyr ×1

excel ×1

file-io ×1

formula ×1

join ×1

list ×1

map ×1

plyr ×1

r-s3 ×1

r-xlsx ×1

reduce ×1

utf-8 ×1