しきい値以上の別の列の値が見つかるまで、ある列の一連の行を合計しようとしています。その合計をオブジェクトに出力し、そのプロセスを繰り返して、次の合計を同じオブジェクトに入れます。
私は主に統計のためにRを使用しましたが、コードを書く能力はかなり限られており、独学で学んでいます。現在、私は一連のデータセットを持っており、各データセットは個人を表しています。各データセット内には、対象となる2つの列と約17,000行があります。一方の列(x)から、もう一方の列(a)で0.17以上の値が検出されるまで、連続する行を合計しようとしています。この値が見つかったら、その合計を別のオブジェクトに出力する必要があります。次に、次の行から始めて、aで0.17以上の値が検出されるまで、xのすべての値を合計する必要があります。したがって、最終的には、データセット全体のこれらすべての合計を含むオブジェクトが作成されます。ループとif / elseを使用するいくつかの関数を試しましたが、適切な結果が得られません。これが最善のアプローチかどうかさえわかりませんが、
x <- c(1,2,3,4,5,6,7,8,7,6,5,4,3,2,1)
a <- c(0.05, .10, 0.1, 0.19, 0.12, 0.15, 0.20, 0.01, 0.08, 0.11, 0.18, 0.14, 0.17, 0.01, 0.02)
summing <- function(x) {
s <- 0
leng <- Inf
n <- nrow(data2)
for(x in 1:(n-1)){
step2<- if(data2$a <= 0.17){
s <- s + x[1]
}
}
return(results)
}
summing(data2$step)
summing <- function(x) {
count <- 1
begin <- 1
results <- list()
x <- rbind(x, c(1))
n <- nrow(x)
for(i in n){
step <- sum(x[i,2], x[i + 1, 2])
t <- x[i +1, 3]
if(abs(x[i + 1, 3]) <= 0.17){
begin <- i + step
}
if(abs(x[i + 1, 3]) > 0.17){
results[[count]] <- begin:1
count <- count + 1
}
}
return(results)
}
このサンプルデータでは、最初の4つの値を合計するオブジェクト(10)、次に5〜7番目(18)、8〜11番目(26)、12〜13番目(7)、14〜15番目(3)が必要です。 。
使用できます tapply
INDEX <- cumsum(a >= 0.17) - (a >= 0.17)
out <- tapply(X = x, INDEX = INDEX, FUN = sum)
out
# 0 1 2 3 4
#10 18 26 7 3
INDEX
によって与えられる場所
INDEX
# [1] 0 0 0 0 1 1 1 2 2 2 2 3 3 4 4
コメントで@dbが指摘しているように、そのグループ化ベクトルを作成する別のオプションは次のとおりです。
INDEX = cumsum(c(FALSE, head(a, -1)) >= 0.17)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加