2011-09-01 54 views
4

我正在尋找有關如何從兩個數據框中列出的彼此減去值的建議。在下面的兩個數據框A和B的例子中,我想在第一列向量匹配的條件下相互減去第二列的值。例如,當向量X 1是R 1然後5.1 - 5和4.8 - 5爲什麼我不能在用cbind創建的數據框中添加數字?

甲< -data.frame(cbind(C( 'R1', 'R1', 'R2', 'R4', 'R4','R4'),c(5.1,4.8,4.9,5.0,5.0,5.3)))

B < -data.frame(cbind(c('R1','R2','R3 ','R4'),c(5,4.9,5.2,5.1)))

+0

您已經以奇怪的方式創建了您的數據框,這迫使您的數字成爲因素。但提供一個可重複的例子做得很好。 –

回答

3

總則第忠告:不要使用cbind當它是沒有必要的:(。你讓這些數字的因素,你不能算術運算符適用於因素)

A <- data.frame(X1=c('R1','R1','R2','R4','R4','R4'),X2=c(5.1,4.8,4.9,5.0,5.0,5.3)) 
B <- data.frame(X1=c('R1','R2','R3','R4'),X2=c(5,4.9,5.2,5.1)) 

當存在非唯一匹配項時,合併函數會返回所有可能的對:

merge(A,B, by=1) 
merge(A,B, by=1)[,2] - merge(A,B, by=1)[,3] 
#[1] 0.1 -0.2 0.0 -0.1 -0.1 0.2 
+0

謝謝Richie&迪文!非常感激。 –

2

定義您的數據,以便數字列確實是數字。 (帶空格以提高可讀性!)

A <- data.frame(
    X1 = c('R1', 'R1', 'R2', 'R4', 'R4', 'R4'), 
    X2 = c(5.1, 4.8, 4.9, 5.0, 5.0, 5.3) 
) 
B <- data.frame(
    X1 = c('R1', 'R2', 'R3', 'R4'), 
    X2 = c(5, 4.9, 5.2, 5.1) 
) 

合併數據幀,然後用結果減去列。

merged <- merge(A, B, "X1") 
with(merged, X2.x - X2.y) 
0

這是使用向量名稱的解決方案。

A <- data.frame(
    X1 = c('R1', 'R1', 'R2', 'R4', 'R4', 'R4'), 
    X2 = c(5.1, 4.8, 4.9, 5.0, 5.0, 5.3), 
    stringsAsFactors = FALSE 
) 

L <- c(5, 4.9, 5.2, 5.1) 
names(L) <- c('R1', 'R2', 'R3', 'R4') 

A$X2-L[A$X1] 
相關問題