我有一个数据
Name Clust1 Clust2 Clust3
AA 0.0662421 0.01742827 0.02286026
BB 0.7694628 0.03241972 0.02935754
CC 0.1099033 0.52170750 0.28385905
DD 0.2769453 0.30376152 0.24822205
我想过滤至少一列大于 0.50 的行。
我正在尝试以下命令:
new.df <- df %>% mutate(confident = ifelse(rowSums(.[,c(1:4)] >= 0.5)>0, 'yes', 'no'))
我收到以下警告,没有任何输出:
Warning message:
In Ops.factor(left, right) : ‘>=’ not meaningful for factors
我希望以下数据框:
Name Clust1 Clust2 Clust3
BB 0.7694628 0.03241972 0.02935754
CC 0.1099033 0.52170750 0.28385905
您是否知道如何修复我的代码以获得所需的输出。谢谢
我们可以直接使用rowSums
df[rowSums(df[2:4] >= 0.5) > 0, ]
# Name Clust1 Clust2 Clust3
#2 BB 0.76946 0.03242 0.029358
#3 CC 0.10990 0.52171 0.283859
或者dplyr
带有filter_at
和any_vars
的版本
library(dplyr)
df %>%
filter_at(vars(starts_with("Clust")), any_vars(. >= 0.5))
就修复您的代码而言,如@thelatemail所述,您将在第 rowSums
1 列中包含第 1 列,这是Name
列,因此您希望将其子集化在第 2:4
列上。我们也可以直接filter
而不是用 mutate
创建新变量,所以以下内容应该有效。
df %>% filter(rowSums(.[,c(2:4)] >= 0.5) > 0)
我们还可以使用apply
版本,这对于较大的数据集来说会很慢
df[apply(df[2:4] >= 0.5, 1, any), ]