我一直在尋找Stackoverflow幾個小時希望找到我猜的東西是不言而喻的,但似乎沒有人問過(這可能意味着它確實是不言而喻的)。使用tapply或通過功能的非默認設置
我想使用tapply
或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))
因此,這裏是我的嘗試,並沒有工作
tapply(m[,4],m[,3],max.col)
#這給剛剛1S爲用得到的載體等於中提到的事件數的長度每一個事件數據集tapply(m[,4],m[,3],max.col(m, ties.method=c("first")))
#match.fun(FUN)中的錯誤: 'max.col(m,ties.method = c(「first」))'不是函數,字符或符號 另外:警告消息:在max.col(m,ties.method = c(「first」))中:引入了NAs d通過強制
2號的確是問題的關鍵。由於我不清楚的原因,一旦將默認的打破平局方法(即「隨機」)更改爲我需要的方式(即「第一個」),max.col就不會被識別爲函數。
此外,我希望能夠找到非零發生的年份。 我認爲一個明智的選擇是將MOMENT列與OCCURENCE列相乘(調用該ID)並查找ID中的第一個非零值(對於每個因子EVENT),保留該ID值並將其他值設爲零
m$MOMENT<-as.numeric(as.character(m$MOMENT))
m$OCCURENCE<-as.numeric(as.character(m$OCCURENCE))
m[,"ID"]<-m$MOMENT * m$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 }})
這裏的想法是在事件迭代功能,而M $ ID == 0,然後更改值並中斷一旦m $ ID> 0.沒有工作...
任何想法如何解決這個(或更簡單的解決方案)?
謝謝G.G這工作像一個魅力,一旦我根據年份訂購變量。不確定ave功能是如何工作的,但它確實有效:)!乾杯 – SJDS