5

ちょっとした問題で立ち往生しましたが、それに対する適切な検索用語が見つかりませんでした。「A」から「N」までの文字があり、「G」よりも大きい文字をアルファベットの位置に従って「A」から「G」に置き換えたいと考えています。そのために使用gsubするのは面倒に思えます。それとも、よりスマートにできる正規表現はありますか?

k <- rep(LETTERS[1:14],2)
gsub(pattern="H", replace="A", x=k)
gsub(pattern="I", replace="B", x=k)
gsub(pattern="J", replace="C", x=k)
gsub(pattern="K", replace="D", x=k)
# etc.

文字を整数に変換し、整数値内で単純に計算してからキャストバックする方法はありませんか? または、LETTERS の逆はありますか? as.numeric()as.integer()戻りますNA

4

5 に答える 5

11

これは HN を AG に変換します。

chartr("HIJKLMN", "ABCDEFG", k)
于 2012-06-23T20:00:19.583 に答える
4

このような問題を見るたびに、最初に考えたのは次のmatchとおりです。

AG <- LETTERS[1:7]
HN <- LETTERS[8:14]

k <- rep(LETTERS[1:14],2)
n <- AG[match(k, HN)]
ifelse(is.na(n), k, n)
# [1] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E"
#[20] "F" "G" "A" "B" "C" "D" "E" "F" "G"

LETTERS同じ方法で逆関数を作成します。

invLETTERS <- function(x) match(x, LETTERS[1:26])
invLETTERS(k)
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14  1  2  3  4  5  6  7  8  9 10 11
#[26] 12 13 14
于 2012-06-23T19:00:37.157 に答える
4

これは、クリーンで簡単なソリューションです。

k <- rep(LETTERS[1:14],2)

# (1) Create a lookup vector whose elements can be indexed into  
#     by their names and will return their associated values
subs <- setNames(rep(LETTERS[1:7], 2), LETTERS[1:14])
subs
#   A   B   C   D   E   F   G   H   I   J   K   L   M   N 
# "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G" 

# (2) Use it.
unname(subs[k])
#  [1] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
# [15] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
于 2012-06-23T19:02:32.047 に答える
3

これをよりコンパクトにする方法があると確信していますが、これはおそらく、2番目の非正規表現のアイデアで考えていたようなものです。

k <- factor(k)
> k1 <- as.integer(k) %% 7
> k1[k1 == 0] <- 7
> LETTERS[k1]
 [1] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G" "A"
[23] "B" "C" "D" "E" "F" "G"

0インデックスの問題を回避するための賢い方法はおそらくありますが、現時点ではそれほど賢いとは感じていません。

編集

コメントからの良い提案。まず、0形式のモジュラー演算を処理するには、次のようにします。

k1 <- ((as.integer(k)-1) %%7) + 1

そしてそれと組み合わせるとmatchワンライナーになります:

k1 <- LETTERS[((match(k, LETTERS)-1) %% 7) + 1]
于 2012-06-23T18:46:59.800 に答える
2

問題が AN だけにある場合:

set.seed(1)
k = sample(LETTERS[1:14], 42, replace=TRUE)
temp = match(k, LETTERS)
# > table(k)
# k
# A B C D E F G I J K L M N 
# 2 2 5 2 1 6 3 3 5 4 3 3 3 
k[which(temp > 7)] = LETTERS[temp[temp > 7] -7]
# > table(k)
# k
# A  B  C  D  E  F  G 
# 2  5 10  6  4  9  6
于 2012-06-23T19:06:13.243 に答える