有没有一种简单的方法来在F#中乘以数组的项目?
因此,例如,我想从样本中计算总体均值,我将按频率乘以观测值,然后除以样本数.
let array_1 = [|1;32;9;5;6|];;
let denominator = Array.sum(array_1);;
denominator;;
let array_2 = [|1;2;3;4;5|];;
let productArray = [| for x in array_1 do
for y in array_2 do
yield x*y |];;
productArray;;
let numerator = Array.sum(productArray);;
numerator/denominator;;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这产生了这样的产品阵列: -
val it : int [] =
[|1; 2; 3; 4; 5; 32; 64; 96; 128; 160; 9; 18; 27; 36; 45; 5; 10; 15; 20; 25;
6; 12; 18; 24; 30|]
Run Code Online (Sandbox Code Playgroud)
哪一切都是一切的产物,而我是在点积之后(x.[i]*y.[i]为每一个i).
不幸的是,为for循环添加一个i变量和一个索引似乎不起作用.
这里使用的最佳解决方案是什么?
我目前正在通过"真实世界的功能编程".我试图让1.12工作,一个使用Windows窗体的"hello world"程序.这是代码: -
open System.Drawing;;
open System.Windows.Forms;;
type HelloWindow() =
let frm = new Form(Width = 400, Height = 140)
let fnt = new Font("Times New Roman", 28.0f)
let lbl = new Label(Dock = DockStyle.Fill, Font = fnt,
TextAlign = ContentAlignment.MiddleCenter)
do frm.Controls.Add(lbl)
member x.SayHello(name) =
let msg = "Hello" + name + "!"
lbl.Text <- msg
member x.Run() =
Application.Run(frm);;
let hello = new HelloWindow();;
hello.SayHello("you");;
hello.Run();;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会引发错误 - "在单个线程上启动第二个消息循环不是有效的操作." 显然,有一个窗口打开而不是终止,这使程序混乱.我看不出如何修复错误,任何人都可以帮助我吗?
我也尝试输入最终的代码块: -
let hello = new HelloWindow()
hello.SayHello("you") …Run Code Online (Sandbox Code Playgroud) 我已为F#中的某些客户端数据定义了记录类型,如下所示: -
type DataPoint = {
date: string;
dr: string;
Group: string;
Product: string;
Book: int;
Revenue: int} with
static member fromFile file =
file
|> File.ReadLines
|> Seq.skip 1 //skip the header
|> Seq.map (fun s-> s.Split ',') // split each line into array
|> Seq.map (fun a -> {date = string a.[0]; dr = string a.[1];
Group = string a.[2]; Product = string a.[3];
Book = int a.[4]; Revenue = int a.[5] });;
// creates a record for …Run Code Online (Sandbox Code Playgroud) 我试图表明我正在分析的一些数据中有一个奇怪的"颠簸"(它与市场份额有关.我的代码在这里: -
qplot(Share, Rate, data = Dataset3, geom=c("point", "smooth"))
Run Code Online (Sandbox Code Playgroud)
(我很欣赏没有数据集这不是非常有用的代码).
无论如何,我可以得到用于从R生成平滑线的数值向量?我只需要该层来尝试将模型拟合到平滑数据.
任何帮助感激不尽.
如何访问csv文件中的条目以便在F#中对它们执行计算?
我可以用通常的方式将csv文件读入内存,但是一旦我被卡住了.
理想情况下,我只需从列创建数组,然后使用array.map2执行计算.
所以我的数组1是一些网站使用指标,第2列是达到第1列中的值的用户数(比如对网站进行6次访问)我们可以通过乘以数组中的每个条目来计算平均访问次数第1列,由第2列组成的数组,除以第2列的array.sum.
我在F#片段http://fssnip.net/3T上尝试了csv to Array代码,但它为我生成了一系列字符串元组.
有谁能建议更好的方法?
编辑:一些示例输入将类似于: -
Visits Count
1 8
2 9
3 5
4 3
5 2
6 1
7 1
10 1
Run Code Online (Sandbox Code Playgroud)
输出将返回数据的平均值,在这种情况下为2.87(小数点后2位).
编辑2:从我发现的CSV到阵列代码的当前输出是这个
val it : seq<BookWindow> =
seq [{Visits = 1;
Count = 8;}; {Visits = 2;
Count = 9;}; {Visits = 3;
Count = 5;}; {Visits = 4;
Count = 3;}; ...]
Run Code Online (Sandbox Code Playgroud)
这对计算没那么有用......
我在使用以下代码时遇到问题,我正在尝试构建一个词法分析器.
我再次使用F#中的科学家的例子.
let lines_of_file filename =
seq { use stream = File.OpenRead filename
use reader = new StreamReader(stream)
while not reader.EndOfStream do
yield reader.ReadLine() };;
let read_matrix filename =
lines_of_file filename
|> Seq.map (String.split [' '])
|> Seq.map (Seq.map float)
|> Math.Matrix.of_seq;;
Run Code Online (Sandbox Code Playgroud)
我声明了以下命名空间: -
open System
open System.IO
open System.Runtime.Serialization.Formatters.Binary
open Microsoft.FSharp.Core
Run Code Online (Sandbox Code Playgroud)
但是在read_matrix函数中,"Split.string"中的"split"无法识别.intellisense也不识别"矩阵".
我已经尝试声明了很多名称空间以查看它们是否识别该方法,但没有任何作用(我的intellisense甚至不识别System.Math).
我很抱歉,如果这是一个愚蠢的问题,我已经看过MSDN和其他地方,但我找不到任何东西.
任何人都可以帮助我让VS识别"分裂"和"矩阵"吗?
非常感谢.
我试图将一系列元组写入csv,但正常的File.WriteAllLines被一系列元组重载.
因此,我试图将我的元组变成一系列字符串.
这是我的代码: -
open System;;
open Microsoft.FSharp.Reflection;;
let tupleToString (t: string * float) =
if FSharpType.IsTuple(t.GetType())
then String.Format("{0},{1}", fst t, snd t)
else "";;
let testTuple = ("monkey", 15.168);;
tupleToString(testTuple);;
let testSeqTuple = [("monkey", 15.168); ("donkey", 12.980)];;
let allIsStrings (t:seq<string * float>) = Seq.collect tupleToString t;;
allIsStrings(testSeqTuple);;
Run Code Online (Sandbox Code Playgroud)
当我在一个元组上使用"tupleToString"时,结果就好了.
然而,allIsStrings的Seq.collect部分返回按字符分解的元组.
我也试过Seq.choose和Seq.fold,但这些只是抛出错误.
任何人都可以建议我应该使用序列模块中的哪些函数 - 或者建议使用可以在元组上工作的File.WriteAllLines的替代方法?
我希望能够在R中逐行扫描csv文件,并排除包含单词"target"的行.
问题是数据来自不同的地方,而"目标"这个词可能出现在数据框的许多不同的列中.
所以我需要一个函数中的一行来查找这个字符串,如果它不存在,那么将该行附加到一个新的数据框(然后我将写为新的csv).
任何和所有帮助感激地收到了.
我试图从一些文件的名称建立一个列表.不幸的是我收到了一个类型错误,我不知道如何纠正.
我的代码: -
open System
let buildStringList (list: string []) =
let initial = []
for i = 0 to list.Length do
let foo = list.[i]
List.append initial foo.Substring(foo.IndexOf("."))
Run Code Online (Sandbox Code Playgroud)
类型错误: -
error FS0001: This expression was expected to have type string -> 'a
but here has type string
Run Code Online (Sandbox Code Playgroud)
这与"foo.Substring(foo.IndexOf("."))"对象有关.在这里更正类型的最佳方法是什么?
非常感谢.