如果我有以下代码:
x1 <- list(1,2,3,4,5,5)
x2 <- list(1,4,7,8)
x3 <- list(5,6)
x4 <- list(1,4,4,5,6,7)
x5 <- list(1,2,3,5,6,9)
x6 <- list(1,4, 6,7,8,7)
myList <- list(x1, x2, x3, x4,x5,x6)
df <- data.frame(t(sapply(myList, function(x){c(x, rep(tail(x, 1),max(lengths(myList)) - length(x)))
})))
这给出了像这样的数据框
X1 X2 X3 X4 X5 X6
1 1 2 3 4 5 5
2 1 4 7 8 8 8
3 5 6 6 6 6 6
4 1 4 4 5 6 7
5 1 2 3 5 6 9
6 1 4 6 7 8 7
如何删除具有最高X6值的2行和具有最低值X6的2行。
答案 0 :(得分:3)
在baseR中,使用[
的子集:
#function sort sorts the df$X6 vector which we subset for the two highest and lowest values
mycol <- df[[rev(names(df))[1]]]
df[!mycol %in% c(sort(mycol)[1:2], rev(sort(mycol))[1:2]), ]
# X1 X2 X3 X4 X5 X6
#4 1 4 4 5 6 7
#6 1 4 6 7 8 7
答案 1 :(得分:3)
试试这个(我根据您更新的样本df
更新了我的答案):
o <- order(unlist(df[names(df)[ncol(df)]]))
df[-c(head(o, 2), tail(o, 2)),]
# X1 X2 X3 X4 X5 X6
#4 1 4 4 5 6 7
#6 1 4 6 7 8 7
names(df)[ncol(df)]
在df
中提供了最右列的名称。
答案 2 :(得分:2)
在基础r
中,可以使用几个简单的步骤来获得所需的数据。
# Data is:
# X1 X2 X3 X4 X5 X6
#1 1 2 3 4 5 5
#2 1 4 7 8 8 8
#3 5 6 6 6 6 6
#4 1 4 4 5 6 7
#5 1 2 3 5 6 9
#6 1 4 6 7 8 7
#order on X6
df <- df[order(df$X6),]
# > df
# X1 X2 X3 X4 X5 X6
# 1 2 3 4 5 5
# 5 6 6 6 6 6
# 1 4 4 5 6 7
# 1 4 6 7 8 7
# 1 4 7 8 8 8
# 1 2 3 5 6 9
#Remove top 2 rows
df <- tail(df, nrow(df) - 2)
#Remove bottom 2 (highest) value one.
> df <- head(df, nrow(df) - 2)
#The result
# > df
# X1 X2 X3 X4 X5 X6
# 1 4 4 5 6 7
# 1 4 6 7 8 7