簡體   English   中英

逐列檢查R中2個數據幀中元素的相等性

[英]Checking equality of elements in 2 dataframes in R column by column

我正在嘗試使用all.equal函數逐列檢查R中兩個數據幀的元素是否相等,我想使用for循環進行此操作。 我是R的新手,所以不確定如何編寫包含兩個數據幀的for循環。

任何幫助表示贊賞。

我注意到這個問題尚未得到解答,所以我想我會給出一個答案供將來參考。

為了提供一個有效的示例,我將使用R附帶的mtcars數據集作為datasets包的一部分。

因此,首先,我們創建一個虛擬數據集以與mtcars進行比較。 讓我們把這個數據集mtcars2並讓我們列5和11, dratcarb分別,不同從原來的一定程度mtcars同行,同時保持列1至4和列6至10完好無損。 為了使第5列和第11列“混亂”,我們將jitter()與簡單的乘法結合使用。

mtcars2 <- as.data.frame(cbind(mtcars[, 1:4], "drat" = jitter(mtcars[,5]) * 4,
                               mtcars[,6:10], "carb" = jitter(mtcars[,11])* 0.5))

因此,現在我們有了一個虛擬數據集,可以與for循環中的mtcars進行比較。 接下來,我們准備一個data.frame以寫入for循環的結果。 我們需要一個data.frame,它的行數等於我們要比較的列數,我們需要兩列,一個col_number來顯示相應的all.equal()結果所指的是哪一列。 然后,當然,我們需要另一列AE_result來存儲將要調用的all_equal()函數的結果。 我們稱這個data.frame df_AE ,我們將宣布col_number是一個數字矢量, AE_result是一個特征向量。

width <- ncol(mtcars)
df_AE <- as.data.frame(matrix(0L, nrow = width, ncol = 2))

names(df_AE) <- c("col_number", "AE_result")
class(df_AE$col_number) <- "numeric"
class(df_AE$AE_result) <- "character" 

因此,現在我們准備好進行實際的for循環了 ,在該循環中 ,我們將對各列進行計數,在每對列上調用all.equal ,並將計數器( i )和結果( x )寫入df_AE data.frame。

for (i in 1:width) {
    x <- all.equal(mtcars[, i], mtcars2[, i])
    df_AE[i,1] <- i
    df_AE[i,2] <- x
}

因此,現在當我們調用df_AE ,將得到如下所示的內容:

df_AE

> df_AE
       col_number                           AE_result
1           1                                TRUE
2           2                                TRUE
3           3                                TRUE
4           4                                TRUE
5           5  Mean relative difference: 3.000102
6           6                                TRUE
7           7                                TRUE
8           8                                TRUE
9           9                                TRUE
10         10                                TRUE
11         11 Mean relative difference: 0.4982218

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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