2016-02-05 33 views
1

我在R的工作。我有4個數據幀,我試圖總結成一個新的數據框。基本上4個起始幀都有rownames,它們是唯一的標識符(其餘都有關於標識符的數據)。存在重疊的可能性,即,ID可能出現在四個表中的一個以上。R - 在數據框上的Upsert

我試圖建立一個與以下格式的數據幀:

ID-DATASET1-DATASET2-DATASET3-DATASET4 
"1"-FALSE-FALSE-TRUE-TRUE 

這基本上說,ID 1出現在數據集3和4。所以我們的目標是要拿出每一個ID的布爾矢量,它告訴我們發現了哪些數據集。我有四個數據集作爲數據框,rownames是ID。因爲我將迭代地構建最終的數據框(稱爲vectorTable),所以我將它初始化爲一個空的數據框。我已經開始在一個函數,它會做如下因素的工作:

  1. 檢查的ID是在向量表
    • 如果是更新正確的布爾值
  2. 否則,建立一個新的布爾矢量,並將其添加

這裏是該功能的代碼:

mapIdToVector <- function(id, vectorTable, dataIdx) { 

    if(id %in% vectorTable$id) { 
     vectorTable[test$id == id][dataIdx] = TRUE 
    } else { 

     # create a vector for the row 
     row <- c(id, FALSE, FALSE, FALSE, FALSE) 
     row[idx] = TRUE 

     rbind(vectorTable, row) 
    } 
} 

這是我試圖讓這個工作,從一個數據集表開始。

idVectorization <- data.frame(id=character(), ds1=logical(), ds2=logical(), ds3=logical(), ds4=logical()) 

# two for ds1 since there is an id column 
lapply(row.names(ds1), mapIdToVector, idVectorization, 2) 

問題是vectorTable沒有得到更新。我不知道這是rbind()還是帶引用/值傳遞的問題。任何提示如何讓這個工作將非常感激!

回答

1

下面是我將如何處理它。

由於你沒有提供的數據,這裏的一些:

a <- data.frame(ID = letters[1:3]) 
b <- data.frame(ID = letters[3:6]) 
d <- data.frame(ID = letters[6:9]) 
e <- data.frame(ID = letters[9:12]) 

第一,我將你的dataframes組合成一個列表,並獲得了所有的ID:

datlist <- list(a,b,d,e) 
allids <- unique(unlist(sapply(datlist, function(x) as.character(x[["ID"]])))) 

然後,每我們檢查每個數據幀,使用嵌套sapply:

t(sapply(allids, function(x) sapply(datlist, function(y) x %in% y[["ID"]]))) 

    [,1] [,2] [,3] [,4] 
a TRUE FALSE FALSE FALSE 
b TRUE FALSE FALSE FALSE 
c TRUE TRUE FALSE FALSE 
d FALSE TRUE FALSE FALSE 
e FALSE TRUE FALSE FALSE 
f FALSE TRUE TRUE FALSE 
g FALSE FALSE TRUE FALSE 
h FALSE FALSE TRUE FALSE 
i FALSE FALSE TRUE TRUE 
j FALSE FALSE FALSE TRUE 
k FALSE FALSE FALSE TRUE 
l FALSE FALSE FALSE TRUE 
+0

工作得很好!謝謝 – mbiokyle