我有一个包含多个个体和同一个体的多个值的文件。我需要删除每个人的前10个和最后10个值,将所有剩余的值放入一个新的表中。
下面是我的数据:
Cow Data
NL123456 123
NL123456 456我试着做一个for循环,计算每个人有多少个值(但我想,我已经被困在那里了,因为我没有使用我认为正确的命令?Cow中的所有变量都是一个因子)。我认为删除第一个和最后一个必须是这样的:data1[c(11: n-10),]
发布于 2019-01-15 23:16:55
如果您知道cow中的数据点始终超过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()在base R中,你可以这样做:
iris_trimmed <- do.call(
rbind,
lapply(split(iris, iris$Species),
function(x) head(tail(x,-10),-10)))
dim(iris_trimmed)
# [1] 90 5发布于 2019-01-15 23:44:13
使用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), ]
)
)发布于 2019-01-15 23:17:08
这里有一个使用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 7https://stackoverflow.com/questions/54201609
复制相似问题