簡體   English   中英

R:跨數據框的多重比較

[英]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 

然后,在<- lhsrhs部分都使用該索引。

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM