在条件上将函数应用于矩阵元素

时间:2013-10-08 14:26:41

标签: r function apply

我希望根据另一个条目的值更改矩阵中某个条目的值。最简单的解释一个例子:
矩阵

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

我很困惑,非常感谢任何帮助! 谢谢!

1 个答案:

答案 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