删除前10个值和后10个值

时间:2019-01-15 15:08:27

标签: r

我有一个文件,其中包含多个个人和同一个人的多个值。 我需要删除每个人的前10个值和后10个值,并将所有剩余的值都放在新表中。

这是我的数据的样子:

Cow        Data   
NL123456   123
NL123456   456

我尝试做一个for循环,每个人计数有多少个值(但是我想,我已经被困在那里了,因为我使用的命令不正确,因为Cow中的所有变量都是一个因素)。 我认为删除第一个和最后一个必须是这样的: data1[c(11: n-10),]

3 个答案:

答案 0 :(得分:3)

如果您知道母牛总是拥有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

答案 1 :(得分:1)

使用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), ]
  )
)

答案 2 :(得分:0)

这里是dplyr的解决方案。

在我的示例中,我仅剪切了第一个和最后一个值。 (您可以通过将filter中的任何数字更改为2来适应它。)

想法是在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