R:跨数据帧的多重比较

时间:2014-10-06 13:15:43

标签: r dataframe

我在R中有两个数据帧(原始数据长度为100k行,有100个类别):

dfBase = data.frame(category=c(1,1,1,2,2,2), id=c(10000, 500, 8000, 500,8000,10000), rank=c(1,2,3,1,2,3))
dfTest = data.frame(category=c(1,1,1,2,2,2), id=c(500, 10000, 8000, 10000, 8000, 500), rank=c(1,2,3,1,2,3))

并且我只想在两个条件(类别和id)匹配的情况下用id替换基线的等级。我有这段代码:

dfTest$category[dfBase$category == dfTest$category & dfBase$id == dfTest$id] <- dfBase$rank

我收到错误:

number of items to replace is not a multiple of replacement length

但是,我在两个数据帧中具有相同的维度。一些值被替换,但有些值被跳过。我对R知之甚少,所以我希望你能帮助我。

2 个答案:

答案 0 :(得分:1)

像在帖子中一样创建逻辑索引。

 indx <- dfBase$category==dfTest$category & dfBase$id==dfTest$id 

然后,在lhs的{​​{1}}和rhs部分使用该索引。

<-

如果您要比较多列(&gt; 2),则可以使用 dfTest$category[indx] <- dfBase$rank[indx] dfTest # category id rank #1 1 500 1 #2 1 10000 2 #3 3 8000 3 #4 2 10000 1 #5 2 8000 2 #6 2 500 3

Reduce

基准

使用原始数据集

v1 <- c('category', 'id')
indx1 <- Reduce(`&`, lapply(v1, function(x) dfBase[,x]==dfTest[,x]))
dfTest$category[indx1] <- dfBase$rank[indx1]

答案 1 :(得分:1)

尝试:

dfTest$category<-ifelse(dfBase$category==dfTest$category & dfBase$id==dfTest$id, dfBase$rank, dfTest$category)