我有个数据:
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.....发布于 2019-03-20 14:40:57
我们可以使用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或者用dplyr,select_if
library(dplyr)
df %>% select_if(~any(. > 0.6))发布于 2019-03-20 14:41:13
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发布于 2019-03-20 14:43:22
下面是一个带有base R的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
library(purrr)
keep(df, map_lgl(df, ~ any(.x > 0.6)))https://stackoverflow.com/questions/55263403
复制相似问题