2016-07-17 21 views
1

私の最初のデータセットには、以下のような行と列が含まれています。 2番目の列(Score_d1)の一部の値がありません(NA)。2つのデータセットをマージする

StudentID  Score_d1 
NA 
    081245  NA 
    957600  78 
    212945  86 
    305049  NA 
    407903  92 

第2のデータセットは以下の通りである。このデータセットには、最初のデータセットにスコア値がないStudentIdのスコア値のみが含まれています。例えば、第一のデータセットでは、StudentID のスコアの値が欠落していたとこの第二のデータセットのScore_d2列には、これらの値私は、このような行方不明(NAそのStudentIDすることにより、これらの2つのデータセットをマージしたい(75, 85)

StudentID  Score_d2 


    081245  94 
    081245  65 
    305049  46 

が含まれています)Score_d1最初のデータセットの値は、2番目のデータセットのScore_d2の値に置き換えられますか?これらの2つのデータセットをマージして、以下のような1対多の最終データセットを作成しますか?

StudentID  Score 


    081245  94 
    081245  65 
    957600  78 
    212945  86 
    305049  46 
    407903  92 

これを達成するための助けがあれば幸いです。あなたが行うことができ

答えて

2

m <- merge(df1,df2,by = "StudentID",all = T) 
m$Score_d1[is.na(m$Score_d1)] <- m$Score_d2[!is.na(m$Score_d2)] 
m[,1:2] 

    # StudentID Score_d1 
# 1  12343  75 
# 2  12343  85 
# 3  81245  94 
# 4  81245  65 
# 5 212945  86 
# 6 305049  46 
# 7 407903  92 
# 8 957600  78 

をアイデアは、最初のStudentIDに基づいて2つのデータフレームを結合し、その後、Score_d2の非NA値でScore_d1のそれらNA値を交換することです。

DATA

df1 <- structure(list(StudentID = c(12343L, 81245L, 957600L, 212945L, 
305049L, 407903L), Score_d1 = c(NA, NA, 78L, 86L, NA, 92L)), .Names = c("StudentID", 
"Score_d1"), class = "data.frame", row.names = c(NA, -6L)) 

df2 <- structure(list(StudentID = c(12343L, 12343L, 81245L, 81245L, 
305049L), Score_d2 = c(75L, 85L, 94L, 65L, 46L)), .Names = c("StudentID", 
"Score_d2"), class = "data.frame", row.names = c(NA, -5L)) 
+0

@DiggyDetroitこれはあなたの問題を解決しましたか? – 989

+0

最初のマージ文は 'm'データフレームに余分な行をいくつか作成したので、' Score_d1'のna値を代入するのではなく、 'temp1 < - m [!is.na(m $ Score_d)出来た。 –

+0

@DiggyDetroitもそれを行うことができますが、私が出力しようとしたものは、問題の説明とあなたが探していた最終結果に基づいていました。確かに、この出力は、質問のマージされた出力が示すものと等価です。 – 989

関連する問題