5

私はマトリックスを持っています

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

何かアドバイス?「if」ループを使用する必要がありますか? ありがとう。

4

2 に答える 2

7

インデックスを見つけるもう少し直接的な方法は、次を使用することmatchです。

> 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

以下で説明するよう%in%に、一般的にはより直感的に使用でき、セットが比較的大きい場合を除き、効率の違いはわずかです。

> 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
于 2012-07-17T09:01:52.313 に答える
7

を使用して、 fromを の値とwhich一致させることができます。次に、インデックスを取得したら、から置換列名をサブセット化できます。colnamesmdf$currentdf$replacement

colnames(m) = df$replacement[which(df$current %in% colnames(m))]

上記では:

  1. %in%比較するオブジェクト間の一致をテストしTRUEます。FALSE
  2. which(df$current %in% colnames(m))一致した名前のインデックス (この場合は行番号) を識別します。
  3. df$replacement[...]df$replacementステップ 2 で一致した行のみを返す列をサブセット化する基本的な方法です。
于 2012-07-17T08:48:13.880 に答える