检查多列是否在R数据框中匹配值

时间:2019-05-15 07:29:32

标签: r

嗨,在符合条件之后,我已经知道行和列,如下所示: 我的数据集:

Power | Channel | Speed | Speed2 | Speed3 
50    | 1       | 400   | 200    | 100
50    | 6       | 400   | 500    |  80
50    | 6       | 400   | 500    | 800

,我想创建一个与我的条件匹配的新列,如果所有列速度> = 100,则返回这些行。例如:

Power | Channel | Speed | Speed2 | Speed3 | Flag
50    | 1       | 400   | 200    | 100    |  1
50    | 6       | 400   | 500    |  80    |  1

我已经知道使用此代码返回的行和列:

which(blk13fullpower <= 100, arr.ind = TRUE)

其输出为:

         row col 
   [1,]   1   1 
   [2,]   2   1
   [3,]   3   1
   [4,]   4   1
   [5,]   5   1
   [6,]   6   1
   [7,]   7   1

但是,我不知道如何根据结果标记我的数据框。 有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

尝试ifelse

blk13fullpower$flag <- ifelse ( blk13fullpower$Speed >100 & blk13fullpower$Speed2 > 100 & blk13fullpower$Speed3 >100 , 1 , 0)

使用dput命令提供一些数据会更容易。

答案 1 :(得分:1)

有多种方法可以做到这一点

cols <- grep("^Speed", names(df))
df[rowSums(df[cols] <= 100, na.rm = TRUE) > 0, ]

apply

df[apply(df[cols] <= 100, 1, any), ]

或与dplyr

library(dplyr)
df %>% filter_at(vars(starts_with("Speed")), any_vars(. <= 100))

如果要使用带有基础R解决方案的flag = 1添加新列,可以使用transform

transform(df[rowSums(df[cols] <= 100, na.rm = TRUE) > 0, ], flag = 1)

mutatedplyr

df %>%  
  filter_at(vars(starts_with("Speed")), any_vars(. <= 100)) %>%
   mutate(flag = 1)