对于某人来说,这可能是一个非常简单的问题 - 我可以用来list.files()获取给定目录中的文件列表,但是如果我想获得目录列表,我该怎么做?它在某种程度上就在我面前作为一种选择list.files()吗?
此外,我正在使用Windows,所以如果答案是支持某些Linux/unix命令,那对我来说无效.
.NET例如有一个Directory.GetFiles()方法和一个单独的Directory.GetDirectories()
方法,所以我认为R会有一个类似的对.提前致谢.
我正在尝试实现我从Don Syme的博客中读到的模式
这表明利用异步I/O可以大幅提升性能.我目前正在尝试使用Array.Parallel.Map以一种方式"工作"一段代码,看看我是否可以使用Async.Parallel以某种方式实现相同的结果,但我真的不明白Async.Parallel,并且无法获得任何工作.
我有一段代码(下面简化说明这一点)成功检索一个cusip的数据数组.(例如价格系列)
let getStockData cusip =
let D = DataProvider()
let arr = D.GetPriceSeries(cusip)
return arr
let data = Array.Parallel.map (fun x -> getStockData x) stockCusips
Run Code Online (Sandbox Code Playgroud)
因此,这种方法构建了一个数组阵列,通过互联网连接到我的数据供应商为每个股票(可能多达3000个)并返回一个数组(每个股票1个,每个股票的价格序列)一).我当然不明白Array.Parallel.map下面发生了什么,但是我想知道这是否是浪费资源的情况,并且它实际上可以更快地使用异步I/O?所以为了测试它,我试图使用asyncs来创建这个函数,我认为下面的函数遵循Don Syme使用URL的文章中的模式,但它不会使用"let!"进行编译.
let getStockDataAsync cusip =
async { let D = DataProvider()
let! arr = D.GetData(cusip)
return arr
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:此表达式应该具有类型Async <'a>但这里有类型obj
它用"let"而不是"let!"来编译很好,但我认为整个问题是你需要感叹号才能使命令在不阻塞线程的情况下运行.
所以第一个问题确实是,上面我的语法有什么问题,在getStockDataAsync中,然后在更高的层次上,任何人都可以提供一些关于异步I/O的额外见解,以及我提出的场景是否会从中受益,使其潜在比Array.Parallel.map更快,更快?非常感谢.
我是R的新手,我正试图处理apply函数系列.具体来说,我正在尝试编写一个高阶函数,它将接受2个字符向量,"host"和"guest"(不需要相同的长度),并返回一个与"host"相同长度的索引向量",结果元素对应于客人的指数(如果不存在,则为NA).
host <- c("A","B","C","D")
guest <- c("D","C","A","F")
matchIndices <- function(x,y)
{
return(match(x,y))
}
Run Code Online (Sandbox Code Playgroud)
此代码按预期返回3:
matchIndices(host[1],guest)
Run Code Online (Sandbox Code Playgroud)
这是我希望能够用简洁的apply函数替换的循环(sapply?)
for (i in 1:length(host))
{ idx <- matchIndices(host[i],guest);
cat(paste(idx,host[i],"\n",sep=";"))
}
Run Code Online (Sandbox Code Playgroud)
这段代码"起作用",因为它产生下面的输出,但我真的希望结果是一个向量,我有一种预感,其中一个应用函数将起作用.我只是坚持如何写它.非常感激任何的帮助.谢谢.
3; A; NA; B; 2; C; 1; d;
还有一个要求 - 结果向量与原始向量的顺序相同.
我有一个非常基本的功能,可以对矢量进行百分位数,并且按照我希望的方式工作:
ptile <- function(x) {
p <- (rank(x) - 1)/(length(which(!is.na(x))) - 1)
p[p > 1] <- NA
p
}
data <- c(1, 2, 3, 100, 200, 300)
Run Code Online (Sandbox Code Playgroud)
例如,ptile(data)生成:
[1] 0.0 0.2 0.4 0.6 0.8 1.0
Run Code Online (Sandbox Code Playgroud)
我真正希望能够做的是使用相同的功能(ptile)并让它在一个因素的水平范围内工作.所以假设我有一个"因素"如下:
f <- as.factor(c("a", "a", "b", "a", "b", "b"))
Run Code Online (Sandbox Code Playgroud)
我希望能够将"数据"转换为一个向量,告诉我,对于每个观察,它相应的百分位数相对于同一级别内的其他观察值是什么,如下所示:
0.0 0.5 0.0 1.0 0.5 1.0
Run Code Online (Sandbox Code Playgroud)
在黑暗中拍摄,我试过:
tapply(data,f,ptile)
Run Code Online (Sandbox Code Playgroud)
事实上,它确实成功地进行了排名/百分比,但这样做是因为我不知道哪些观察结果与原始向量中的索引相匹配:
[1] a a b a b b
Levels: a b
> tapply(data,f,ptile)
$a
[1] 0.0 0.5 1.0
$b
[1] 0.0 0.5 …Run Code Online (Sandbox Code Playgroud) 我能够在因子水平内成功获得给定向量的简单均值,但是在尝试将其用于加权观察的下一步时,我无法使其工作.这有效:
> tapply(exp.f,part.f.p.d,mean)
1 2 3 4 5 6 7 8 9 10
0.8535996 1.1256058 0.6968142 1.4346451 0.8136110 1.2006801 1.6112160 1.9168835 1.5135006 3.0312460
Run Code Online (Sandbox Code Playgroud)
但这不是:
> tapply(exp.f,part.f.p.d,weighted.mean,b.pct)
Error in weighted.mean.default(X[[1L]], ...) :
'x' and 'w' must have the same length
>
Run Code Online (Sandbox Code Playgroud)
在下面的代码中,我试图找到exp.f的加权平均值,在因子part.fpd的水平内,由b.pct中每个级别的观察值加权.
b.exp <- tapply(exp.f,part.f.p.d,weighted.mean,b.pct)
Error in weighted.mean.default(X[[1L]], ...) :
'x' and 'w' must have the same length
Run Code Online (Sandbox Code Playgroud)
我想我必须提供不正确的语法,因为所有这三个向量都是相同的长度:
> length(b.pct)
[1] 978
> length(exp.f)
[1] 978
> length(part.f.p.d)
[1] 978
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?先感谢您.