2016-02-05 48 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