我有一个文件,其中包含多个个人和同一个人的多个值。 我需要删除每个人的前10个值和后10个值,并将所有剩余的值都放在新表中。
这是我的数据的样子:
Cow Data
NL123456 123
NL123456 456
我尝试做一个for循环,每个人计数有多少个值(但是我想,我已经被困在那里了,因为我使用的命令不正确,因为Cow中的所有变量都是一个因素)。
我认为删除第一个和最后一个必须是这样的:
data1[c(11: n-10),]
答案 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