使用r中的数据框替换列名称

使用r中的数据框替换列名称,r,matrix,dataframe,R,Matrix,Dataframe,我有矩阵 m <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE,dimnames = list(c("s1", "s2", "s3"),c("tom", "dick","bob"))) tom dick bob s1 1 2 3 s2 4 5 6 s3 7 8 9 #and the data frame current<-c("tom", "dick","harry","bob") r

我有矩阵

m <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE,dimnames = list(c("s1", "s2", "s3"),c("tom", "dick","bob")))

   tom dick bob
s1   1    2   3
s2   4    5   6
s3   7    8   9

#and the data frame

current<-c("tom", "dick","harry","bob")
replacement<-c("x","y","z","b")
df<-data.frame(current,replacement)

  current replacement
1     tom           x
2    dick           y
3   harry           z
4     bob           b

#I need to replace the existing names i.e. df$current with df$replacement if 
#colnames(m) are equal to df$current thereby producing the following matrix


m <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE,dimnames = list(c("s1", "s2", "s3"),c("x", "y","b")))

   x y b
s1 1 2 3
s2 4 5 6
s3 7 8 9

m您可以使用
which
m
中的
colnames
df$current
中的值相匹配。然后,当您拥有索引时,您可以从
df$replacement
中对替换colname进行子集化

colnames(m) = df$replacement[which(df$current %in% colnames(m))]
在上述情况下:

  • %in%
    测试被比较对象之间的
    TRUE
    FALSE
    匹配情况
  • 其中(df$current%in%colnames(m))
    标识匹配名称的索引(在本例中为行号)
  • df$replacement[…]
    是将列子集化的基本方法
    df$replacement
    只返回与步骤2匹配的行
    查找索引的更直接的方法是使用
    匹配

    > id <- match(colnames(m), df$current)
    > id
    [1] 1 2 4
    > colnames(m) <- df$replacement[id]
    > m
       x y b
    s1 1 2 3
    s2 4 5 6
    s3 7 8 9
    

    你能再解释一下这一行程序是如何工作的吗?这将使它更容易为初学者阅读。@PaulHiemstra补充了一个解释——不确定它是否是最好的。请随时改进或提供建议。+1,带示例代码的好问题。+1--
    %in%
    匹配
    非常相似。我通常更喜欢
    哪个
    和%
    中的
    %,因为我更容易记住,因为它的内容类似于:“这些值(
    df$current
    )中的哪些值在这些其他值(
    colnames(m)
    )中?”使用
    match
    时,我总是倾向于使用相同的格式,最终使用
    NA
    s。不过,我不知道这两种方式是否存在任何性能问题。你是对的,
    %in%
    更直观,因此通常使用起来更好,
    ?match
    提供了更多关于优缺点的信息。对于极客阿蒙请告诉我们我将添加一些时间!
    > n <- 50000 # size of full vector
    > m <- 10000 # size of subset
    > query <- paste("A", sort(sample(1:n, m)))
    > names <- paste("A", 1:n)
    > all.equal(which(names %in% query), match(query, names))
    [1] TRUE
    > library(rbenchmark)
    > benchmark(which(names %in% query))
                         test replications elapsed relative user.self sys.self user.child sys.child
    1 which(names %in% query)          100   0.267        1     0.268        0          0         0
    > benchmark(match(query, names))
                     test replications elapsed relative user.self sys.self user.child sys.child
    1 match(query, names)          100   0.172        1     0.172        0          0         0