根据行的内容删除数据框中的行

时间:2018-01-15 22:57:44

标签: r

如果我有以下代码:

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行。

3 个答案:

答案 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