我在R.工作。我有4个数据框,包含我试图汇总到新数据框的数据。基本上,4个起始帧具有唯一标识符的rownames(其余的具有关于标识符的数据)。存在重叠的可能性,即ID可能会出现在四个表中的多个表中。
我正在尝试使用以下格式构建数据框:
ID-DATASET1-DATASET2-DATASET3-DATASET4
"1"-FALSE-FALSE-TRUE-TRUE
基本上这表示ID 1出现在数据集3和4中。所以我们的目标是为每个ID提供一个布尔矢量,它告诉我们找到了什么数据集。我有四个数据集作为数据帧,并且rownames是ID。由于我将迭代地构建最终的数据帧(称为vectorTable),因此我将其初始化为空数据帧。我已经开始研究一个将执行以下操作的函数:
以下是该函数的代码:
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()或者引用/值传递是一个问题。任何有关如何使其工作的提示将非常感谢!
答案 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