[英]R: Multiple Comparison across dataframes
我在R中有两个数据框(原始数据长10万行,有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知之甚少,无法理解这一点,所以希望您能为我提供帮助。
像在帖子中一样创建一个逻辑索引。
indx <- dfBase$category==dfTest$category & dfBase$id==dfTest$id
然后,在<-
lhs
和rhs
部分都使用该索引。
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
如果有多个要比较的列(> 2),则可以使用Reduce
v1 <- c('category', 'id')
indx1 <- Reduce(`&`, lapply(v1, function(x) dfBase[,x]==dfTest[,x]))
dfTest$category[indx1] <- dfBase$rank[indx1]
使用原始数据集
df1 <- dfBase[rep(1:nrow(dfBase),1e5),]
df2 <- dfTest[rep(1:nrow(dfTest),1e5),]
f1 <- function() {df2$category <- ifelse(df1$category==df2$category &
df1$id==df2$id, df1$rank, df2$category)}
f2 <- function() { indx <- df1$category==df2$category & df1$id==df2$id
df2$category[indx] <- df1$rank[indx]
}
library(microbenchmark)
microbenchmark(f1(), f2(), unit="relative")
#Unit: relative
#expr min lq mean median uq max neval
#f1() 3.746782 3.967783 3.698517 3.850763 3.435416 2.224864 100
#f2() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100
尝试:
dfTest$category<-ifelse(dfBase$category==dfTest$category & dfBase$id==dfTest$id, dfBase$rank, dfTest$category)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.