Подмножество в строках фрейма данных в R - PullRequest
0 голосов
/ 18 октября 2018

У меня есть фрейм данных с 30 строками и 4 столбцами (а именно, x, y, z, u).Это дано ниже.

mydata = data.frame(x = rnorm(30,4), y = rnorm(30,2,1), z = rnorm(30,3,1), u = rnorm(30,5))

Далее, у меня есть значения последовательности, которые представляют номер строки в моем фрейме данных.

myseq = c(seq(1, 30, by = 5))
myseq
[1]  1  6 11 16 21 26

Теперь я хотел вычислить probзначения для каждого сегмента из 99 строк.

filt= subset(mydata[1:6,], mydata[1:6,]$x < mydata[1:6,]$y & mydata[1:6,]$z < mydata[1:6,]$u
filt
prob = length(filt$x)/30
prob

Затем мне нужно вычислить выше prob для 1:6, .., 27:30 и так далее.Здесь у меня только 6 prob значений.Итак, я могу сделать один за другим.Если бы у меня было 100 значений, это было бы утомительно.Есть ли способ вычислить значения prob?

Заранее спасибо.

1 Ответ

0 голосов
/ 18 октября 2018

Кстати: в subset(DF[1:99,], ...), используйте DF[1:99,] в первом аргументе, а не снова, ala

subset(DF[1:99,], cumsuml < inchivaluel & cumsumr < inchivaluer)

Подумайте, как это сделать в list.

  1. Первый шаг - разбить данные на начальные точки va.Я начну со списка индексов, чтобы разбить его на:

    inds <- mapply(seq, va, c(va[-1], nrow(DF)), SIMPLIFY=FALSE)
    

    Теперь это список последовательностей, начиная с 1:99, затем 100:198 и т. Д. См. str(inds), чтобыпроверить.

  2. Теперь мы можем подразделить часть данных на основе вектора индексов каждого элемента:

    filts <- lapply(inds, function(ind) subset(DF[ind,], cumsuml < inchivaluel & cumsumr < inchivaluer))
    
  3. Теперь у нас есть списоквекторы, давайте подведем итог:

    results <- sapply(filts, function(filt) length(filt$cumsuml)/length(alpha))
    

Итог, это помогает подумать о том, как разбить эту проблему на списки, примеры на http://stackoverflow.com/a/24376207/3358272.

BTW:вместо того, чтобы изначально составить список индексов, мы могли бы просто разбить данные на этом первом шаге, ala

DF2 <- mapply(function(a,b) DF[a:b,], va, c(va[-1], nrow(DF)), SIMPLIFY=FALSE)
filts <- lapply(DF2, function(x) subset(x, cumsuml < inchivaluel & cumsumr < inchivaluer))
results <- sapply(filts, function(filt) length(filt$cumsuml)/length(alpha))
...