我有一个带点分隔字符列的数据框:
> 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) 给出一个清单:
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,数字变量成为一个因素......
最近一位同事正在研究呼叫图,并希望看到什么叫做什么.我们用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)
以前做过这件事,在一个包裹中说,并且我错过了任何会破坏我这样做的陷阱吗?
假设您有两种文档类型,客户和订单.一个客户文档包含如姓名,地址等和基本信息的订单包含所有的订单信息每次客户订单的东西.存储文档时,type = order或type = customer.
如果我在一组10个客户和30个订单上执行地图功能,它将输出40行.有些行是客户,有些是订单.
问题是,如何编写reduce,以便将订单信息"填充"在具有客户信息的行内?因此它将返回10行(10个客户),但每个客户的所有相关订单.
基本上我不想在输出上单独记录,我想将它们组合在一起(订单分成一个客户行)我觉得减少是这样的吗?
我已将数据从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
定义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 ..
该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
我目前正在研究一个案例研究,我需要在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数据库文件以及如何解释这些数字?谢谢.
给定一个函数的向量(实际上是一个列表):
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某个地方错过了一个功能?函数将始终是单个标量值的函数并返回单个标量值.
假设您正在对二项式数据进行建模,其中每个响应是来自多个试验(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增添了一些含义,使其明确.
有没有人有更好的想法?这样做的正确方法是什么?