2014-12-03 57 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