重命名数据帧中的ID

时间:2014-12-03 12:13:23

标签: r dataframe rename

我尝试将下面嵌套数据框中的两个ID列重命名为数字字符。我尝试使用以下代码进行操作:

原始数据框是A:

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重命名为除了1和2之外的其他变量(例如,我更喜欢"M"更改为100和{ {1}}进入101而不是1和2)。

谢谢

1 个答案:

答案 0 :(得分: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_1y_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)))