筛选行最大值大于阈值的行

时间:2019-01-22 12:12:53

标签: r dataframe

我有一个数据框,例如:

x <- data.frame("Names"= c("name1","name2","name3"), "A" = c(0.1,0.1,0.8), "B" = c(0.3,0.4,0.3), "C" = c(0.05,0.9,0.05),"D" =c(0.6,0.1,0.3))

> x
  Names   A   B    C   D
1 name1 0.1 0.3 0.05 0.6
2 name2 0.1 0.4 0.90 0.1
3 name3 0.8 0.3 0.05 0.3

我想删除A,B,C或D的最大值低于0.8的所有行。然后,获取:

> x
  Names   A   B    C   D
2 name2 0.1 0.4 0.90 0.1
3 name3 0.8 0.3 0.05 0.3

名称1被删除,因为最大值为0.6。

然后,我想获取一个文件,例如,我获得NameX的列名称为最大值,在此示例中为:

Name1 : C with value 0.9
Name2 : A with value 0.8 

谢谢您的帮助。

4 个答案:

答案 0 :(得分:2)

您可以使用pmax,即

x[do.call(pmax, x[-1]) >= 0.8,]
#  Names   A   B    C   D
#2 name2 0.1 0.4 0.90 0.1
#3 name3 0.8 0.3 0.05 0.3

答案 1 :(得分:1)

要过滤行,您可以使用any

df <- x[apply(x[, -1], 1, function(x) any(x >= 0.8)), ]
df
#  Names   A   B    C   D
#2 name2 0.1 0.4 0.90 0.1
#3 name3 0.8 0.3 0.05 0.3

关于第二个问题,我不确定您要做什么。如果这是关于生成{result”字符串的vector,则可以

apply(df, 1, function(x) {
    idx <- which.max(x[-1])
    sprintf("%s: %s with value %s", x[1], colnames(df)[idx + 1], x[-1][idx]) })
#                         2                          3
#"name2: C with value 0.90"  "name3: A with value 0.8"

或者,如果您喜欢data.frame,也许是这样的

ret <- data.frame(result = rep("", nrow(df)), stringsAsFactors = F)
for (i in 1:nrow(df)) {
    idx <- which.max(df[i, -1])
    ret$result[i] <- sprintf(
        "%s: %s with value %s", 
        df[i, 1], colnames(df)[idx + 1], df[i, -1][idx])
}
ret
#                   result
#1 name2: C with value 0.9
#2 name3: A with value 0.8

答案 2 :(得分:1)

x[rowSums(x[-1] >= 0.8) != 0, ]

  Names   A   B    C   D
2 name2 0.1 0.4 0.90 0.1
3 name3 0.8 0.3 0.05 0.3

答案 3 :(得分:1)

data.table解决方案:

x <- data.table::data.table(x)
x [ pmax(A,B,C,D) >= .8 , , ]
x [  , paste(colnames(x)[1+which(c(A,B,C,D)==(max(A,B,C,D)))], " with value ", max(A,B,C,D)), by=Names]