【问题标题】:Apply a function to elements of matrix on condition在条件下将函数应用于矩阵的元素
【发布时间】:2013-10-08 14:26:41
【问题描述】:

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

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)。

有什么方法可以让我查看哪些行在第一列中有一个,然后在对应的第四列中放置一个 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

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

【问题讨论】:

    标签: r function apply


    【解决方案1】:

    假设你的列名是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)
    

    将通过正则表达式匹配将XXX-YYY 形式的values 向量中的任何字符串替换为YYY-XXX。结果是values 的“对应”的字符向量。然后我们使用%in% 来选择行名出现在这些对应值中的每一行,并在第四列中为这些行分配2

    【讨论】:

    • 感谢您的回复。我刚刚输入了该代码,但我似乎无法让它工作。在我的矩阵中,我实际上没有“-”,这只是为了使其更易于阅读,所以我尝试了这个:m[rownames(m) %in% gsub("......","\\2-\\1", values),4] = 2,而不是在“...”周围有一个括号,也没有,但两者都没有似乎工作。再次感谢
    • @Mike 试试gsub("(...)(...)","\\2\\1", values) ?
    • 太棒了!那行得通。你介意向我解释一下代码在做什么吗?我理解第一行,它只是找到符合条件的行。但是第二行我根本不明白。谢谢! ——
    • @Mike 刚刚为我的回答添加了解释。希望它足够清楚。
    猜你喜欢
    • 2016-02-20
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多