2017-06-09 4 views
1

簡単な例を挙げてください。 データフレームdata1があります。人々を意味Rデータフレームを通過したいときに "for"を避ける方法

name<-c("John","John","Mike","Amy".....) 
nationality<-c("Canada","America","Spain","Japan".....) 
data1<-data.frame(name,nationality....) 

は 、それぞれの人が彼の名前と国、ノー繰り返しにより特化されたさまざまな国からです。

第二のデータフレームが

name2<-c("John","John","Mike","John",......) 
nationality2<-c("Canada","Canada","Canada".....) 
score<-c(87,67,98,78,56......) 
data2<-data.frame(name2,nationality2,score) 

あるすべての人々は、彼らが5点の得点を持っていますが、それらはランダムな順序であることを意味する、data2で5行を持っていることを約束しています。

私がしたいことは、すべての人の5つの得点を知ることですが、私は彼の名前が何であり、どこから来たのか気にしませんでした。私が持っていると思います

最後のデータフレームが

score1 score2 score3 score4 score5 
1 89  89  87  78  90 
2 ... 
3 ... 

すべての行は1点の5点の得点を表しているが、私は彼が誰であるか気にしません。 私のデータ番号が大きいので、私はfor機能を使用することはできません。 私は何ができますか?

+0

最終的なデータフレームは5つの列を持ち、各行は1人の5つの得点を表します。 –

+0

ここでデータ1を使用していないようですね。 –

+0

ああ、申し訳ありませんが、私はdata2には多くのデータがあることを伝えるのを忘れています。しかし、私はちょうどdata1に現れる人々に興味があります。 –

答えて

0

それはあなたが求めているものだ私には思える:

data1 <- data.frame(name = c("John","Mike","Amy"), 
       nationality = c("America","Canada","Canada")) 

data2 <- data.frame(name2 = rep(c("John","Mike","Amy","Jack","John"),each = 5), 
        score = sample(100,25), nationality2 =rep(c("America","Canada","Canada","Canada","Canada"),each = 5)) 

data3 <- merge(data2,data1,by.x=c("name2","nationality2"),by.y=c("name","nationality")) 
data3$name_country <- paste(data3$name2,data3$nationality2) 
all_scores_list <- tapply(data3$score,data3$name_country,c) 
as.data.frame(do.call(rbind,all_scores_list)) 

# V1 V2 V3 V4 V5 
# Amy Canada 57 69 90 81 50 
# John America 4 92 75 15 2 
# Mike Canada 25 86 51 20 12 
+0

あなたの答えをありがとう。 –

+0

しかし、実際にはジョンはアメリカやカナダから来ることができ、私はアメリカのジョンに興味があります –

+0

ok私もそうすることができます:) –

2

ベースRIを使用して、すでに受け入れ答えは、ワイドから再形成のための便利なdcast()機能を使用するソリューションを提案したいと考えているが、代わりにrbind()tapply()と繰り返し呼び出しを使用しての長い形式:

library(data.table) # CRAN version 1.10.4 used 
dcast(setDT(data2)[setDT(data1), on = c(name2 = "name", nationality2 = "nationality")], 
     name2 + nationality2 ~ paste0("score", rowid(rleid(name2, nationality2))), 
            value.var = "score") 

戻り

name2 nationality2 score1 score2 score3 score4 score5 
1: Amy  Canada  93  91  73  8  79 
2: John  America  3  77  69  89  31 
3: Mike  Canada  76  92  46  47  75 
+0

大変ありがとうございます。 data.tableを学習するための別の例。このパッケージは、data.frameを扱う際に静かに強力なようです –

関連する問題