亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅保留每個因子水平的最小值

僅保留每個因子水平的最小值

蠱毒傳說 2019-10-11 14:44:12
我遇到了困擾我一段時間的問題……希望這里的任何人都可以幫助我。我得到以下數據框f <- c('a','a','b','b','b','c','d','d','d','d')v1 <- c(1.3,10,2,10,10,1.1,10,3.1,10,10)v2 <- c(1:10)df <- data.frame(f,v1,v2)f是一個因素;v1和v2是值。對于f的每個級別,我只想保留一行:在該因子級別中v1值最低的那一行。f   v1  v2a   1.3 1b   2   3c   1.1 6d   3.1 8我嘗試了聚合,ddply,by,tapply等各種方法,但是似乎沒有任何效果。如有任何建議,我將非常感謝。
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

使用DWin的解決方案,tapply可以避免使用ave。


df[ df$v1 == ave(df$v1, df$f, FUN=min), ]

如下所示,這又可以提高速度。請注意,這也取決于級別數。我注意到ave,盡管它是R中更強大的功能之一,但我經常忘記它。


f <- rep(letters[1:20],10000)

v1 <- rnorm(20*10000)

v2 <- 1:(20*10000)

df <- data.frame(f,v1,v2)


> system.time(df[ df$v1 == ave(df$v1, df$f, FUN=min), ])

   user  system elapsed 

   0.05    0.00    0.05 


> system.time(df[ df$v1 %in% tapply(df$v1, df$f, min), ])

   user  system elapsed 

   0.25    0.03    0.29 


> system.time(lapply(split(df, df$f), FUN = function(x) {

+             vec <- which(x[3] == min(x[3]))

+             return(x[vec, ])

+         })

+  .... [TRUNCATED] 

   user  system elapsed 

   0.56    0.00    0.58 


> system.time(df[tapply(1:nrow(df),df$f,function(i) i[which.min(df$v1[i])]),]

+ )

   user  system elapsed 

   0.17    0.00    0.19 


> system.time( ddply(df, .var = "f", .fun = function(x) {

+     return(subset(x, v1 %in% min(v1)))

+     }

+ )

+ )

   user  system elapsed 

   0.28    0.00    0.28 


查看完整回答
反對 回復 2019-10-11
  • 3 回答
  • 0 關注
  • 511 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號