【问题标题】:renaming IDs in dataframes重命名数据框中的 ID
【发布时间】:2014-12-03 12:13:23
【问题描述】:

我正在尝试将下面嵌套数据框中的两个 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 重命名为除 1s 和 2s 之外的其他变量的方法(例如,我希望将 "M" 更改为 100 并将 "O" 更改为 101 而不是 1s和 2s)。

谢谢

【问题讨论】:

    标签: r dataframe rename


    【解决方案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)))
    

    另一个选项是检查先前的值是否不等于当前行的值。 IE。 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)。然后使用与上述相同的 indexing/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)))
    

    【讨论】:

    • 那是您拥有的甜蜜代码,运行良好且更易于阅读和理解。谢谢!
    • 您介意解释一下最后两个代码吗?尤其是cumsum(c(TRUE, x[-1]!=x[-length(x)])) 部分。我猜这是说最后一列不应该被视为累积和?谢谢
    • @非常感谢akrun,解释的很清楚!
    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    相关资源
    最近更新 更多