提取具有大于R数据帧中特定值的列

时间:2019-03-20 14:39:10

标签: r

我有一个数据框:

Alix    Blim    Jux Gyno
0.105   0.234   0.67    0.89
0.01    0.542   0.11    0.65
0.003   0.002   0.6     0.67
0.009   0.123   0.09    0.01

从上面的数据框中,我想提取所有值大于0.6的列,如下所示:

Jux Gyno
0.67    0.89
0.11    0.65
0.6     0.67
0.09    0.01

这是我的代码不起作用:

out <- vector()

for(i in colnames(df){
  if(df[i] > 0.6){
     T <- df[,i]
  }
  out <- cbind.data.frame(out,T)
}

我遇到了类似的错误:

Error in data.frame(Check.names= F...). Argument imply differing number of rows.....

5 个答案:

答案 0 :(得分:3)

我们可以使用colSums使用基数R来对列进行子集

df[colSums(df > 0.6) > 0]

# Jux Gyno
#1 0.67 0.89
#2 0.11 0.65
#3 0.60 0.67
#4 0.09 0.01

或与dplyrselect_if

library(dplyr)
df %>% select_if(~any(. > 0.6))

答案 1 :(得分:2)

df <- read.table(text='Alix    Blim    Jux Gyno
0.105   0.234   0.67    0.89
0.01    0.542   0.11    0.65
0.003   0.002   0.6     0.67
0.009   0.123   0.09    0.01
', header=T)

我们可以使用sapply在每一列中找到最大值,然后检查它是否大于0.6。这提供了一个逻辑向量,可用于按列对df进行子集化:

df[,sapply(df, max) > 0.6]

   Jux Gyno
1 0.67 0.89
2 0.11 0.65
3 0.60 0.67
4 0.09 0.01

答案 2 :(得分:2)

这是base R的{​​{1}}选项

Filter

或使用Filter(function(x) any(x > 0.6), df) # Jux Gyno #1 0.67 0.89 #2 0.11 0.65 #3 0.60 0.67 #4 0.09 0.01

transmute_if

或与library(dplyr) df %>% transmute_if(~ any(.x > 0.6), I)

keep

答案 3 :(得分:1)

> df[ , sapply(df, function(x) any(x>0.6))]
   Jux Gyno
1 0.67 0.89
2 0.11 0.65
3 0.60 0.67
4 0.09 0.01

答案 4 :(得分:1)

请为以后的问题提供一个可复制的示例。

这是我的dplyr解决方案:

library(tidyverse)

df <- tibble(First = 0:5,
             Second = 10:15,
             Third = 20:25)

is_greater_than <- function(x) any(x > 10)

select_if(df, is_greater_than)