我希望根据另一个条目的值更改矩阵中某个条目的值。最简单的解释一个例子:
矩阵
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)。
我是否有某种方式可以查看哪些行在第一列中有一个,然后在其对应的第四列中放置一个?在上面的例子中:
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
我很困惑,非常感谢任何帮助! 谢谢!
答案 0 :(得分: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
格式的XXX-YYY
向量中的任何字符串YYY-XXX
。结果是values
的“对应物”的字符向量。然后我们使用%in%
选择其rownames出现在这些对应值中的每一行,并在第四列中为这些行指定2
。