[英]Count last rows that meet a criteria in R
我正在嘗試制作一個計數器來添加符合條件的最后一行。 當不滿足此標准時,計數器必須停止。
讓我解釋:
拿這個df
df = data.frame(a = c(1,4,3,6,5,3,5,6,2,6,7,1,4,5,7),
b = c(1,5,5,4,8,5,1,4,8,1,5,4,8,7,6),
c = c(4,5,5,8,6,1,4,8,5,5,1,5,1,4,7))
我只想對最后幾行中滿足x > 3
的值求和:
所以,結果必須是:
我編寫了一個代碼來執行此操作,但速度很慢:
df = data.frame(a = c(1,4,3,6,5,3,5,6,2,6,7,1,4,5,7),
b = c(1,5,5,4,8,5,1,4,8,1,5,4,8,7,6),
c = c(4,5,5,8,6,1,4,8,5,5,1,5,1,4,7))
df_with_results = data.frame("a" = NA,
"b" = NA,
"c" = NA)
n_line = 0
count = 0
for(i in 1:ncol(df)){ #loop for each column
for(k in 0:nrow(df)){ #loop for each row
if(df[(nrow(df)-k), i] > 3) {
count = count + 1
} else {
break
}
}
df_with_results[1,i] = count
count = 0 #column change
}
有小費嗎?
謝謝
我們可以在這里使用rle
library(dplyr)
sapply(df, \(x) with(rle(x > 3), last(lengths)[last(values)])[1])
a b c
3 5 2
單程:
df = data.frame(a = c(1,4,3,6,5,3,5,6,2,6,7,1,4,5,7),
b = c(1,5,5,4,8,5,1,4,8,1,5,4,8,7,6),
c = c(4,5,5,8,6,1,4,8,5,5,1,5,1,4,7))
sapply(df, \(x) match(T, rev(x) <= 3, length(x) + 1) - 1)
#> a b c
#> 3 5 2
其它的辦法:
sapply(df, \(x) sum(cumprod(rev(x)>3)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.