【发布时间】:2014-10-01 08:01:33
【问题描述】:
我试图弄清楚如何将某个函数仅应用于最后一列具有相同条目的矩阵的行,但直到现在还没有运气。
我的矩阵(我们将简称为 matrix 并假设它是 5x4)如下所示:
d1.1 d1.2 d1.3 NAME1
d2.1 d2.2 d2.3 NAME1
d3.1 d3.2 d3.3 NAME2
d4.1 d4.2 d4.3 NAME3
d5.1 d5.2 d5.3 NAME2`
我想对同名的行进行汇总统计fun1,以便得到一个看起来像这样的最终矩阵:
fun1(d1.1, d2.1) fun1(d1.2, d2.2) fun1(d1.3, d2.3) NAME1
fun1(d3.1, d5.1) fun1(d3.2, d5.2) fun1(d3.3, d5.3) NAME2
d4.1 d4.2 d4.3 NAME3.
fun1 也可以在“单”行上执行,即
fun1(d1.1, d2.1) fun1(d1.2, d2.2) fun1(d1.3, d2.3) NAME1
fun1(d3.1, d5.1) fun1(d3.2, d5.2) fun1(d3.3, d5.3) NAME2
fun1(d4.1) fun1(d4.2) fun1(d4.3) NAME3.
我试过了
sapply(subset(matrix[,1:3], as.character(matrix[,4])==as.character(listofnames)), fun1)
但当然它不起作用。当前的问题在于子集as.character(matrix[,4])==as.character(listofnames),因为这两个对象具有不同的尺寸,但我确信这不是唯一的。
我试图寻找类似的问题,但我只是通过指定的(数字)条件 (>3) 或模式(每组 7 个有序条目)找到子集。没有运气因素或性格。
我想plyr 包中可能有一些有用的东西,但我无法让它工作。任何建议都非常感谢!
更新
就我而言,fun1=min。问题同时发生了变化:在保持数据按NAME 分组的同时,我想获取每组中第 1 列的最小值并保存找到最小值的整行,如下所示:假设@987654332 @ 和d5.1 < d3.1,然后是矩阵
d1.1 d1.2 d1.3 NAME1
d2.1 d2.2 d2.3 NAME1
d3.1 d3.2 d3.3 NAME2
d4.1 d4.2 d4.3 NAME3
d5.1 d5.2 d5.3 NAME2
应该变成
d1.1 d1.2 d1.3 NAME1
d4.1 d4.2 d4.3 NAME3
d5.1 d5.2 d5.3 NAME2
不会丢失其他列。
我尝试按照建议使用mutate 和summarise 参数,但不断收到警告和错误(实际上我发现help() 一点帮助都没有)。
【问题讨论】:
-
@jejroje 如果列是不同的
classes,将matrix转换为data.frame可能会更好 -
我更新了帖子。当您执行
summarise_each或summarise时,每个分组变量的输出将为 1 行。因此,如果您在每一行中都有 cmets 并希望保留它,summarise_each之后的一种可能性是将left_join与原始数据集一起使用,或者只使用mutate_each。目前尚不清楚您的预期输出是什么。