R - 在数据帧上{Up}

时间:2016-02-05 17:02:28

标签: r

我在R.工作。我有4个数据框,包含我试图汇总到新数据框的数据。基本上,4个起始帧具有唯一标识符的rownames(其余的具有关于标识符的数据)。存在重叠的可能性,即ID可能会出现在四个表中的多个表中。

我正在尝试使用以下格式构建数据框:

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

基本上这表示ID 1出现在数据集3和4中。所以我们的目标是为每个ID提供一个布尔矢量,它告诉我们找到了什么数据集。我有四个数据集作为数据帧,并且rownames是ID。由于我将迭代地构建最终的数据帧(称为vectorTable),因此我将其初始化为空数据帧。我已经开始研究一个将执行以下操作的函数:

  1. 检查向量表中是否有ID
    • 如果是,请更新正确的布尔值
  2. 否则构建一个新的布尔向量并添加它
  3. 以下是该函数的代码:

    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 个答案:

答案 0 :(得分: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])

首先,我会将您的数据框组合到一个列表中并获取所有ID:

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

然后,对于每个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