我有 5 列包含數字資料,我想篩選與 5 列中至少 3 列中的資料范圍匹配的行。
例如,我有以下資料框,并定義了 5-10 的值范圍。我的第一行有 3 列,值在 5 到 10 之間,所以我想保留該行。第二行只有 5 到 10 之間的 2 個值,所以我想洗掉它。
| 第一列 | 列2 | 第3列 | 第4列 | 第5列 |
|---|---|---|---|---|
| 7 | 4 | 10 | 9 | 2 |
| 4 | 8 | 2 | 6 | 2 |
uj5u.com熱心網友回復:
首先測驗列中的值是否大于或等于 5 且小于或等于 10,然后查找符合條件的 3 或更多行。
dat[ rowSums( dat >= 5 & dat <= 10 ) >= 3, ]
column1 column2 column3 column4 column5
1 7 4 10 9 2
資料
dat <- structure(list(column1 = c(7L, 4L), column2 = c(4L, 8L), column3 = c(10L,
2L), column4 = c(9L, 6L), column5 = c(2, 2)), class = "data.frame", row.names = c(NA,
-2L))
uj5u.com熱心網友回復:
我想分享第二種方法:
# Setting up data
my_df <- tibble::tibble(A = c(7,4), B = c(4,8), C = c(10, 2), D = c(9,6), E = c(2,2), X = c("some", "character"))
my_min <- 5
my_max <- 10
然后做一些tidyverse-magic:
# This is verbose, but shows clearly all the steps involved:
my_df_filtered <- my_df %>%
dplyr::mutate(n_cols_in_range = dplyr::across(where(is.numeric), ~ .x >= my_min & .x <= my_max)
) %>%
dplyr::rowwise() %>%
dplyr::mutate(n_cols_in_range = sum(n_cols_in_range, na.rm = TRUE)
) %>%
dplyr::filter(n_cols_in_range >= 3
) %>%
dplyr::select(-n_cols_in_range)
以上等價于:
my_df_filtered <- my_df %>%
dplyr::rowwise() %>%
dplyr::filter(sum(dplyr::across(where(is.numeric), ~ .x >= my_min & .x <= my_max), na.rm = TRUE) >= 3)
但我必須宣告,上面的答案顯然更優雅,因為它只需要 1 行代碼!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/378699.html
下一篇:當同一單詞出現在另一列時合并行
