假设我有以下类型的一些数据:
df<-as.data.frame(matrix(rnorm(10*10000, 1, .5), ncol=10))
我想要一个保留 10 个原始列的新数据框,但每列仅保留最高 10 个和最低 10 个值。重要的是,行的名称与需要保留在新数据框中的 id 值相对应。
因此,最终结果 data.frame 的尺寸将是 m × 10,其中 m 很可能大于 20。但对于每一列,我只需要 20 个有效值。
我能想到的唯一方法是每列手动执行此操作,使用 dplyr 并排列,抓取顶部和底部行,然后从所有单独的向量创建一个矩阵。显然这是低效的。帮忙?
最佳答案
假设您想要保留原始数据集中的所有行,其中至少有一个值满足您的条件(给定列中十个最大或十个最小的值),您可以这样做:
# create a data frame
df<-as.data.frame(matrix(rnorm(10*10000, 1, .5), ncol=10))
# function to find lowes 10 and highest 10 values
lowHigh <- function(x)
{
test <- x
test[!(order(x) <= 10 | order(x) >= (length(x)- 10))] <- NA
test
}
# apply the function defined above
test2 <- apply(df, 2, lowHigh)
# use the original rownames
rownames(test2) <- rownames(df)
# keep only rows where there is value of interest
finalData <- test2[apply(apply(test2, 2, is.na), 1, sum) < 10, ]
请注意,肯定有一些更聪明的方法来做到这一点......
关于r - 提取 R 中列的最高和最低值以及行标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42009812/