2016-05-02 9 views
1

私は、データフレームのすべての行に関数を適用したいです。適用を使用すると、結果はそれ自体がデータフレームではなく、リストまたは行列のように見えますか? (私はそれがデータフレームがないだけという、私が手出力から伝えることができるように十分なRを知らない)R:データフレームを返す適用のような機能?

右関数は、データのすべての行に関数を適用するために使用することです

フレーム、新しいデータフレームを返しますか?

私は、各行に適用する機能:

map_uri <- function(request){ 
    ret <- request 
    uri_stem <- uri_map[uri_map[,1] == request["cs-uri-query"],2] 
    if(length(uri_stem) > 0){ 
     ret <- request 
     ret["cs-uri-stem"] <- uri_stem 
     ret["cs-uri-query"] <- "-" 
    } 
    if(request["cs-uri-stem"] == "/index.html"){ 
     ret["cs-uri-stem"] = "/" 
    } 

    return(ret) 

} 

私がしようとしています何:清め[、c。で私にエラー

Fehlerを与える

cleansed <- apply(requests, 1, map_uri) 
cleansed[,c("cs-uri-query", "cs-uri-stem")] 

を( "CS-URI-ステム"、 "CS-URI-クエリ")]:Indizierung außerhalbデルGrenzen

(インデックス範囲外の)何らかの理由で

、間違ったインデックスの上に作る方法で構造が変化。

本実施例にする[編集]

データ:

uri_map.tsv変換関数のhttp://pastebin.com/XhUuTMqA

uri_map <- read.table("http://pastebin.com/raw/XhUuTMqA", sep="\t", header=FALSE) 

入力データ:

http://pastebin.com/b7ja4rKn

リクエスト< - read.tableを( "http://pastebin.com/raw/b7ja4rKn"、9月=」」、ヘッダ= TRUE)

+1

'apply'転置:'((行列を適用します1:4,2)、1、アイデンティティ) 'を含む。 – Roland

+0

@Rolandどうもありがとうございました!それは単に文書化されていないか、十分に注意深く読まなかったのですか? – kutschkem

+0

これは 'help(" apply ")'に書かれていますが、ややわかりにくいです。 – Roland

答えて

5

あなた適用家族を使用することができますが、あなたは正しい、結果はmatrixdata.frameのいずれかです。バックdata.frameに取得するというわけではない大したこと。

あなたの関数は列にわたって一貫性のあるものを返す必要がある(生irisの代わりiris[, 1:4]数値カラムからsummary戻っ6数字の3つのレベルの要因となるためiris$Speciesの、下記動作しない)、どこreproducibleがあろうとです助けて。以下、Iはirissummary使用:

  1. を適用する:sapply as.data.frame(apply(iris[, 1:4], 2, summary))
  2. :lapply as.data.frame(sapply(iris[, 1:4], summary))
  3. do.call(cbind, lapply(iris[, 1:4], summary))
+0

1の代わりにapply(*、2、*)を使用した理由はありますか? 1は行、2は列です。 – kutschkem

+1

私のキャプテン –

関連する問題