2017-01-23 54 views
0

我試圖用all.equal函數檢查R列中兩個數據幀的元素是否相等,並且我想使用for循環來執行此操作。我是R新手,所以我不確定如何編寫包含兩個數據框的for循環。檢查R列中的2個數據幀中元素的等於列

任何幫助表示讚賞。

回答

0

我注意到這個問題還沒有得到回答,所以我想我會爲未來的參考寫下答案。

爲了提供一個工作示例,我將使用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)) 

所以現在我們有一個虛擬的數據集來比較mtcars在我們的for循環。接下來我們準備一個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