我有一个数据框:
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.....
答案 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
或与dplyr
,select_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)