1

別のエントリの値に基づいて、マトリックス内の特定のエントリの値を変更しようとしています。例で説明するのが最も簡単です:
行列

ABC-DEF 1 0 0 0  
HIJ-KLM 0 0 0 0  
NOP-QRS 1 0 0 0  
KLM-HIJ 0 0 0 0  
DEF-ABC 0 0 0 0  
QRS-NOP 0 0 0 0  

ご覧のとおり、上のマトリックスの各行には対応する行があります (たとえば、ABC-DEF の対応する行は DEF-ABC です)。

最初の列に 1 がある行を確認し、対応する行の 4 番目の列に 2 を配置する方法はありますか? 上記の例では、次のようになります。

ABC-DEF 1 0 0 0  
HIJ-KLM 0 0 0 0  
NOP-QRS 1 0 0 0  
KLM-HIJ 0 0 0 0  
DEF-ABC 0 0 0 2  
QRS-NOP 0 0 0 2

私はかなり立ち往生していて、本当に助けていただければ幸いです! ありがとう!

4

1 に答える 1

5

V1列名が,...,であると仮定すると、V5次のようなことができます:

values <- d$V1[d$V2==1]
d$V5[d$V1 %in% gsub("(...)-(...)","\\2-\\1", values)] <- 2

どちらが得られますか:

       V1 V2 V3 V4 V5
1 ABC-DEF  1  0  0  0
2 HIJ-KLM  0  0  0  0
3 NOP-QRS  1  0  0  0
4 KLM-HIJ  0  0  0  0
5 DEF-ABC  0  0  0  2
6 QRS-NOP  0  0  0  2

データ フレームではなく、データがm行名を持つ数値行列である場合は、次のことができます。

values <- rownames(m)[m[,1]==1]
m[rownames(m) %in% gsub("(...)-(...)","\\2-\\1", values),4] <- 2

編集:コードが何をしているかを理解するには、次のことを確認する必要があります。

gsub("(...)-(...)","\\2-\\1", values)

正規表現マッチングを介して、valuesフォームのベクトル内の任意の文字列を置き換えます。結果は、 の「対応物」の文字ベクトルです。次に 、行名がこれらの対応する値に表示されるすべての行を選択し、これらの行の 4 番目の列に割り当てます。XXX-YYYYYY-XXXvalues%in%2

于 2013-10-08T14:32:42.640 に答える