R 将tapply或by与功能的非默认设置一起使用

R 将tapply或by与功能的非默认设置一起使用,r,if-statement,lapply,tapply,R,If Statement,Lapply,Tapply,我在Stackoverflow搜索了几个小时,希望找到一些我猜是不言而喻的东西,但似乎没有人问过(这可能意味着这确实是不言而喻的) 我想使用taply或by,来查找数据帧中第一次发生特定事件的时间(第一个非零值)。我以前做这件事的方式是通过 max.col(df, ties.method = c("first")) 但不知何故,当与tapply或by一起使用时,这并不起作用。下面是一些示例数据 FIRM<-as.vector(sample(c("a","b","c","d"),100,r

我在Stackoverflow搜索了几个小时,希望找到一些我猜是不言而喻的东西,但似乎没有人问过(这可能意味着这确实是不言而喻的)

我想使用
taply
by
,来查找数据帧中第一次发生特定事件的时间(第一个非零值)。我以前做这件事的方式是通过

max.col(df, ties.method = c("first"))
但不知何故,当与tapply或by一起使用时,这并不起作用。下面是一些示例数据

FIRM<-as.vector(sample(c("a","b","c","d"),100,replace=T))
MOMENT<-as.vector(sample((1990:1995),100,replace=T))
EVENT<-as.vector(sample(c("x12","x43","x35","y71","y81","xy1","xy67","yy123","xx901"),100,replace=T))
OCCURENCE<-as.vector(sample(c(0,1),100,replace=T))
m<-as.data.frame(cbind(FIRM,MOMENT,EVENT,OCCURENCE))
我曾尝试使用一个函数来编写此代码,该函数包含
when
if
语句,并使用
break
,但它不起作用

tapply(m$ID,m$EVENT, function(x) m$ID[i]<- while (m$ID[i] == 0) {m$ID[i]
                  if (m$ID[i]>0) {m$YEAR[i] && break }})
tapply(m$ID,m$EVENT,function(x)m$ID[i]0){m$YEAR[i]&&break})
这里的想法是在m$ID==0时在事件上迭代函数,然后在m$ID>0时更改值并中断。没用


关于如何解决这个问题(或更简单的解决方案)有什么想法吗?

问题的
tapply
FUN
参数必须是函数,但问题中的代码提供的是表达式,而不是函数。试试这个:

tapply(m[,4], m[,3], max.col, ties.method =  "first")
这将给出每个事件中第一行的逻辑指示符,其发生列中有1,第二行将选择这些行:

o <- order(m$EVENT, m$MOMENT) # omit this and next line if already ordered
m <- m[o,]

is.first <- ave(m$OCCURENCE == 1, m$EVENT, FUN = function(x) x & !duplicated(x))
m[is.first, ]

o我不太确定您想要实现什么,所以这里只提供一些编码建议

首先,您需要阅读
help(“tapply”)
以了解如何将参数传递给传递给
tapply
的函数:

tapply(m[,4],m[,3],max.col, ties.method="first")
然而,我怀疑这是否符合你的需要。也许像这样的东西会有用:

m<-data.frame(FIRM,MOMENT,EVENT,OCCURENCE)
#note how I create the data.frame in a different way 
#in order to avoid coercing all columns to factors


tapply(m[,4],m[,3],which.max)
#  x12   x35   x43 xx901   xy1  xy67   y71   y81 yy123 
#    2     1     2     3     1     1     3     1     1 

tapply(m[,4],m[,3],function(x) m[which.max(x), "MOMENT"])
#  x12   x35   x43 xx901   xy1  xy67   y71   y81 yy123 
# 1995  1995  1995  1991  1995  1995  1991  1995  1995 

mThanks G.G一旦我按照年份对变量进行排序,这就像一个符咒。不确定ave函数到底是如何工作的,但它做到了:)!干杯汉克斯@Roland,我之前并没有想到哪个.max函数。我认为它给出了最大值,而不是第一个最大值,所以这也非常有效。嘿@Roland,我一直在尝试让你的解决方案有效,但它似乎会出错。结果是不同的,这取决于数据的顺序(当然可以是固定的),在你的例子中,它给出了xx901作为1991年,例如,这是错误的,它应该是1992年,x43给出了1995年,但它应该是1990年。。。这可能与which.max如何查找第一个最大值有关,即由因子m[,3]确定的子组内的起始位置。。。不确定。无论如何,您的同事通过ave函数提出的建议非常有效。谢谢你的帮助!当然,这取决于顺序。我知道你要求的是data.frame中的第一个职位,而不是第一年。如果你想要第一年,你需要订购data.frame或使用不同的方法。嗨@Roland,这也是我的想法。我的问题应该更清楚。然而,即使我订购df,结果仍然是不正确的,尽管。。。
m<-data.frame(FIRM,MOMENT,EVENT,OCCURENCE)
#note how I create the data.frame in a different way 
#in order to avoid coercing all columns to factors


tapply(m[,4],m[,3],which.max)
#  x12   x35   x43 xx901   xy1  xy67   y71   y81 yy123 
#    2     1     2     3     1     1     3     1     1 

tapply(m[,4],m[,3],function(x) m[which.max(x), "MOMENT"])
#  x12   x35   x43 xx901   xy1  xy67   y71   y81 yy123 
# 1995  1995  1995  1991  1995  1995  1991  1995  1995