我尝试将下面嵌套数据框中的两个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)。
谢谢
答案 0 :(得分:1)
我们可以使用lapply
并将我们需要更改index
的列进行分组。在A
数据集中,我们对x_1
和y_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
值将替换为100
,2
替换为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:6
和c(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)))