gpt4 book ai didi

R 删除第一个和最后一个 x % 的行

转载 作者:行者123 更新时间:2023-12-02 07:20:48 25 4
gpt4 key购买 nike

我有一个包含 3 个 ID 变量的数据框,然后每个 ID 有几个值。

user   Log Pass  Value
2 2 123 342
2 2 123 543
2 2 123 231
2 2 124 257
2 2 124 342
4 3 125 543
4 3 125 231
4 3 125 257
4 3 125 342
4 3 125 543
4 3 125 231
4 3 125 257
4 3 125 543
4 3 125 231
4 3 125 257
4 3 125 543
4 3 125 231
4 3 125 257
4 3 125 543
4 3 125 231
4 3 125 257

每组值的开始和结束有时会很嘈杂,我希望能够删除前几个值。不幸的是,值的数量变化很大,但始终是前 20% 和最后 20% 的值是有噪声的。

我想删除前 20% 的行,至少删除 1 行。

例如,如果用户 2 日志 2 传递 123 有 20 个值,我想删除第一行和最后 4 行。如果 ID 变量只有 3 个值,我想删除第一行和最后一行。

生成的数据集将是:

user   Log Pass  Value
2 2 123 543
4 3 125 543
4 3 125 231
4 3 125 257
4 3 125 543
4 3 125 231
4 3 125 257
4 3 125 543
4 3 125 231

我试过摆弄 nrow 但我很难弄清楚如何通过 id 变量引用行的百分比。

谢谢。

乔纳森。

最佳答案

我相信以下可以做到。

数据。

dat <-
structure(list(user = c(2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), Log = c(2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L), Pass = c(123L, 123L, 123L, 124L, 124L, 125L, 125L,
125L, 125L, 125L, 125L, 125L, 125L, 125L, 125L, 125L, 125L, 125L,
125L, 125L, 125L), Value = c(342L, 543L, 231L, 257L, 342L, 543L,
231L, 257L, 342L, 543L, 231L, 257L, 543L, 231L, 257L, 543L, 231L,
257L, 543L, 231L, 257L)), .Names = c("user", "Log", "Pass", "Value"
), class = "data.frame", row.names = c(NA, -21L))

代码。

fun <- function(x, p = 0.20){
n <- nrow(x)
m <- max(1, round(n*p))
inx <- c(seq_len(m), n - seq_len(m) + 1)
x[-inx, ]
}

result <- do.call(rbind, lapply(split(dat, dat$user), fun))
row.names(result) <- NULL
result
# user Log Pass Value
#1 2 2 123 543
#2 2 2 123 231
#3 2 2 124 257
#4 4 3 125 342
#5 4 3 125 543
#6 4 3 125 231
#7 4 3 125 257
#8 4 3 125 543
#9 4 3 125 231
#10 4 3 125 257
#11 4 3 125 543
#12 4 3 125 231
#13 4 3 125 257

关于R 删除第一个和最后一个 x % 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46546870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com