1

いくつかのデータ形式変換を行うためのユーティリティ関数を書いていますが、それを正しく記述できないため、適用したいデータに適用され、正しい形状の結果が返されます。

私はHiRawTinyと呼ばれるテストデータセットを持っています。strは以下に示されています。V1のデータはcharです。GetRankというテスト関数があります。この関数の仕事は、「:」の右側にあるすべての文字を取得して、それらを数値に強制変換することです。これも以下に示されています。strsplitの出力を取得するためにfnで使用したリスト構文のリストは、私には少し不透明です。率直に言って、試行錯誤で到達しましたが、単一の値を渡した場合は問題なく機能するようです。しかし、ベクトル(データフレーム列)を渡すと、渡したベクトルと同じ長さのベクトル結果は得られず、単一の値しか得られません。

これを整理するにはどうすればよいですか?私はRに不慣れで(何十年も前にSを使用していましたが)、構文の混乱に陥ったのではないかと思います。私がやろうとしていることを考えると、私の関数の構文は間違っていますか?これを行うために、「適用」またはその友人の1人を使用することを検討する必要がありますか?または、fnはベクトル入力/ベクトル出力をネイティブに処理できる必要がありますか?

str(HiRawTiny)

>'data.frame':  10 obs. of  7 variables:  
>$ V1: chr  "RANK:1" "RANK:2" "RANK:3" "RANK:4" ...  
$ V2: chr 
> "SOURCEID:CWC02001632398F4C" "SOURCEID:CWC020000F0D57DD6"
> "SOURCEID:CWC0200214C29872E" "SOURCEID:CWC0200163206B9F2" ...  
$ V3:
> chr  "TIME:01:04:2012-22:23:58" "TIME:01:04:2012-12:07:55"
> "TIME:01:04:2012-12:39:51" "TIME:02:04:2012-07:18:25" ...  
$ V4: chr 
> "SCORE:3142" "SCORE:3040" "SCORE:2911" "SCORE:2882" ...  
$ V5: chr 
> "TIEBREAK:4923864" "TIEBREAK:5787094" "TIEBREAK:766764"
> "TIEBREAK:1872936" ...  
$ V6: chr  "" "" "" "" ...  
$ V7: chr  "" ""
> "" "" ...

 GetRank function(x) {as.numeric(strsplit(x, split=":")[[1]][2]) }

GetRank(HiRawTiny[1,1]) [1] 1
GetRank(HiRawTiny[2,1]) [1] 2
GetRank(HiRawTiny[,1]) [1] 1

#"What I want is a vector of GetRank being applied to all of column 1
4

3 に答える 3

3

strsplitretursa list。の各要素にlistは、分割された文字列が含まれています。をwithに変更してlistから、2番目の列を選択できます。matrixdo.callrbind

GetRank <- function(x) {as.numeric(do.call(rbind, strsplit(x, split=":"))[, 2]) }

GetRank(HiRawTiny$V1)
于 2013-01-28T12:48:10.603 に答える
3

ちょうど別の方法(@Stephanを使用foo):

# split by strsplit, results in a list with the 2nd element of 
# each element of the list always being the number you want.
# so pick it up using sapply with "[[" and convert it to numeric
> as.numeric(sapply(strsplit(foo, ":"), "[[", 2))
于 2013-01-28T13:17:52.963 に答える
2

unlist結果をstrsplit取得してから、関心のあるエントリを抽出する必要があります。

foo <- paste("RANK:",1:10,sep="")
GetRank <- function(x) {
  as.numeric(unlist(strsplit(x,":"))[seq(2,2*length(x),by=2)])
}
GetRank(foo)

データを関数にビットごとにフィードし、連続する各ステップで何が起こるかを追跡してみてください。

于 2013-01-28T12:42:10.417 に答える