【发布时间】:2014-03-20 22:05:54
【问题描述】:
我正在尝试编写一个函数,该函数允许我查找给定年份中事件的多次首次出现。事件在不同的时间发生在不同的公司身上。所以一个事件可能在 1980 年第一次发生在 c 公司,然后在 1981 年发生在 b 公司。在这种情况下,我只需要找到公司 c_1980 和矩阵中的相关值。
但是,如果一个事件直到 1986 年发生在 a 公司和 1986 年也发生在 e 公司才发生,那么我需要在矩阵中找到 a_1986 和 e_1986 及其各自值的结果。
我的 (2500 * 800) 矩阵在纵轴上有 2500 个不同的事件,在横轴上有 800 个不同的 year_firm 组合。所有值都介于 0 和 10 之间(在实矩阵中,在示例中介于 0 和 2 之间),绝大多数为零。
示例数据:
av<-matrix(rep(0:2),10,40)
av[1:7,]=0 ; av[9,3:14]=0
av[,c(22,38)]=1
colnames(av)<-paste(c("a","b","c","d","e"),rep(1980:1987, each=5),sep="_")
col.av<-colnames(av)
rownames(av)<-paste("X",1:10,sep="")
row.av<-rownames(av)
我一直使用的主要公式给出了第一次出现的矩阵中的位置:
first<-max.col(av>0,"first")
这可以很好地找到第一次出现。然而,正如数据显示的那样,有时这在同一年会多次发生(例如,第 8 行中的事件发生在 1980 年,公司 a、b、d 和 e -> 鉴于这是第 8 行变为非第 8 行的第一年-zero 我需要找到 4 个不同的值作为输出)。
到目前为止,我的代码基本上是一个补丁解决方案
avdum1<-matrix(cbind(seq(1:nrow(av)),first),nrow=nrow(av),ncol=2)
avdum2<-matrix(cbind(row.av,first),nrow=nrow(av),ncol=2)
使用 avdum1 和 avdum2 以及原始的行名和列名,然后我可以设计一个矩阵,让我在原始矩阵中第一次出现,以及第一次出现的确切值(1 或 2)以及公司-年份组合
firsttime<-matrix(cbind(row.av,col.av[first],av[avdum1]),nrow=nrow(av),ncol=3)
到目前为止一切顺利。 现在,要找到同一年的其他第一次出现,我要做的是
av[avdum1]<-0
这将原始的第一次出现置于零,然后我再次运行整个过程,然后展开第一次矩阵,将列名拆分为年份和公司名称 a、b、c、d、e,比较年,看看第二次第一次出现是否发生在同一年。如果是这样,我必须第三次重新运行整个过程,依此类推(我的真实数据集有 40 家公司)。
这变得相当麻烦,所以我想知道是否有更聪明的方法来做到这一点?可能基于该事件在矩阵中的相对位置发现阳性事件后进行本地化搜索?
最终期望的结果:
(如果您复制示例数据,则可以在生成矩阵时忽略初始警告)
对于第 1 到 7 行,结果将是 b_1984,值为 1 对于第 8 行,结果应该是 a_1980 和 1、b_1980 和 2、d_1980 和 1 和 e_1980 和 2 对于第 9 行,a_1980 与 2 对于第 10 行,b_1980 为 1,c_1980 为 2,e_1980 为 1
希望这可以澄清之前的一些问题/cmets
非常欢迎任何建议!
【问题讨论】:
-
也许按公司拆分矩阵并在每个公司上分别运行
max.col?您所说的“多次首次出现”是什么意思并不十分清楚。 -
嗨,Carl,按公司拆分将导致每次最多 40 个事件发生(前提是每个公司在不同时间发生该事件。我的意思是“多次第一次发生”是相同的)事件(行)在同一年发生在不同的公司(a,b,c,d,e)。max.col 中的选项“first”选择第一个出现的事件,它是按字母顺序排列的,因此名称为 a,b 的公司,c 比名称为 d,e...的更可能归因于第一次出现。
-
好的,那么如何在所有行上运行一个循环,并执行
which(row[j]==max(row[j])来收集所有最大值? (即,甚至不用理会max.col) -
Carl,这也不起作用,因为它只会给我连续出现的最高值,而不是第一个正值。它也不会帮助找到与第一个正值在同一年的第二个正值。
-
听起来您需要更好地定义您的标准。对于初学者来说,什么是“第一次出现”?尝试发布一个小的、可重复的数据集,并准确解释您想要的输出。
标签: r search matrix time-series