2014-12-03 59 views
0

我試圖將嵌套數據框中的兩個ID列重命名爲數字字符。我試着用下面的代碼做它:在數據框中重命名ID

原始數據幀是:

x_1 <- c("A1", "A1","A1", "B10", "B10", "B10","B10", "B500", "C100", "C100", "C100", "D40", "G100", "G100") 

y_1 <- c(rep("M", 8), rep("O", 6)) 

z_1 <- c(1.1, 1.4, 1.6, -1.0, -2.2, 3, 2.3, 2.0, -3.4, -4.1, 2, 2, 2.4, -3.5) 


A <- data.frame(x_1, z_1, y_1) 

所需數據幀是B:

y_3 <- factor(A$x_1, levels = unique(A$x_1), labels = 1:length(unique(A$x_1))) 

y_4 <- factor(A$y_1, levels = unique(A$y_1), labels = 1:length(unique(A$y_1))) 

B <- data.frame(y_3, z_1, y_4) 

我只是想知道是否有人知道的其他更簡單或更有效的方法 - 可能在R中使用其他包。我的原始數據非常大,效率在此處至關重要。另外,我還沒有完全想到將y_1重命名爲1s和2s之外的其他變量的方法(例如,我更願意將"M"更改爲100而將"O"更改爲101而不是1和2)。

感謝

回答

1

我們可以使用lapply和其子集那些我們需要改變index列。在A數據集中,我們對x_1y_1列感興趣。將這些columns轉換爲factor,然後使用as.numeric這將給出數字索引,然後分配這些列。

A[,c('x_1','y_1')] <- lapply(A[,c('x_1','y_1')], 
         function(x) as.numeric(factor(x))) 

另一種選擇是檢查前面的值是否與當前行值不相等。即。 x[-1]!= x[-length(x)]。這裏x[-1]刪除第一個元素,同樣,x[-length(x)]刪除最後一個元素(使長度相同)。然後使用c(TRUE,..)獲得長度與x對象的長度相同,並執行cumsum。如果列已經排序,則此方法有效。否則,factor方法更安全。

A[,c(1,3)] <- lapply(A[,c(1,3)], function(x) 
       cumsum(c(TRUE,x[-1]!=x[-length(x)]))) 

若要更改1:2索引100, 101,您可以使用數字索引本身。這裏的1值將被1002替換爲101

A[,3] <- c(100,101)[A[,3]] 
A 
# x_1 z_1 y_1 
#1 1 1.1 100 
#2 1 1.4 100 
#3 1 1.6 100 
#4 2 -1.0 100 
#5 2 -2.2 100 
#6 2 3.0 100 
#7 2 2.3 100 
#8 3 2.0 100 
#9 4 -3.4 101 
#10 4 -4.1 101 
#11 4 2.0 101 
#12 5 2.0 101 
#13 6 2.4 101 
#14 6 -3.5 101 

另一種方法是使用Map考慮,我們不希望對所有列相同的索引。這裏,x值是列x_1,y_1,其將在2元素的列表中。對應的y值將爲1:6c(101, 102)。然後使用與上述相同的索引/ as.numeric。

A[,c(1,3)] <- Map(function(x, y) y[as.numeric(factor(x))] , 
          A[,c(1,3)], list(1:6, c(100,101))) 
+0

這是一個你在那裏的甜蜜代碼,工作得很好,閱讀和理解也更容易。謝謝! – 2014-12-03 12:20:48

+0

你介意解釋最後兩個代碼,特別是'cumsum(c(TRUE,x [-1]!= x [-length(x)]))''部分。我猜這是說最後一列不應該被視爲一個累積和?謝謝 – 2014-12-03 12:27:26

+0

@John是的,我會更新帖子 – akrun 2014-12-03 12:28:15