Удалить первые 10 и последние 10 значений - PullRequest
0 голосов
/ 15 января 2019

У меня есть файл, который содержит несколько лиц и несколько значений для одного человека. Мне нужно удалить первые 10 и последние 10 значений каждого человека, поместив все оставшиеся значения в новую таблицу.

Вот как выглядят мои данные:

Cow        Data   
NL123456   123
NL123456   456

Я пытался сделать цикл for, подсчитывая для каждого индивидуума, сколько значений было (но я думаю, что я уже застрял там, потому что я не использую правильную команду, я думаю? Все переменные в Cow являются фактором). Я решил, что удаление первого и последнего должно быть примерно таким: data1[c(11: n-10),]

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Здесь решение с dplyr.

В моем примере я вырезал только первое и последнее значения. (вы можете изменить его, изменив 2 на любое число в filter).

Идея состоит в том, чтобы добавить после вас group_by id номер строки для каждого наблюдения, начиная сверху (n) и наоборот снизу (n1), тогда вы просто отфильтруете.

library(dplyr)

data %>% 
  group_by(id) %>% 
  mutate(n=1:n(),
         n1 = n():1) %>% # n and n1 are the row numbers
  filter(n >= 2,n1 >= 2) %>%  # change 2 with 10, or whatever
# filter() keeps only the rows that you want
  select(-n, -n1) %>%
  ungroup()
# # A tibble: 4 x 2
# id value
# <dbl> <int>
# 1     1     6
# 2     1     8
# 3     2     1
# 4     2     2

Данные:

set.seed(123)
data <- data.frame(id = c(rep(1,4), rep(2,4)), value=sample(8))
data
#   id value
# 1  1     3
# 2  1     6
# 3  1     8
# 4  1     5
# 5  2     4
# 6  2     1
# 7  2     2
# 8  2     7
0 голосов
/ 15 января 2019

Использование data.table:

library(data.table)
idt <- as.data.table(iris)
idt[, .SD[11:(.N-10)], Species]

Та же логика в base R:

do.call(
  rbind, 
  lapply(
    split(iris, iris[["Species"]]), 
    function(x) x[11:(nrow(x)-10), ]
  )
)
0 голосов
/ 15 января 2019

Если вы знаете, что у вас всегда есть более 20 точек данных по корове, вы можете сделать следующее, как показано в наборе данных iris:

library(dplyr)

dim(iris)
# [1] 150   5

iris_trimmed <-
  iris %>%
  group_by(Species) %>%
  slice(11:(n()-10)) %>%
  ungroup()

dim(iris_trimmed)
# [1] 90  5

В ваших данных:

res <-
  your_data %>%
  group_by(Cow) %>%
  slice(11:(n()-10)) %>%
  ungroup()

В базе R вы можете сделать:

iris_trimmed <- do.call(
  rbind, 
  lapply(split(iris, iris$Species),
         function(x) head(tail(x,-10),-10)))

dim(iris_trimmed)
# [1] 90  5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...