Фильтрация строк путем сопоставления значения столбца со значением другого столбца в R - PullRequest
0 голосов
/ 28 февраля 2019

Я довольно новичок в R, так что это может оказаться проще, чем ожидалось, возможно, я слишком много думаю.Скажем, у меня есть data.frame (df), и я хочу выбрать строки, которые соответствуют критериям, из другого столбца, но главное, чтобы критерии были исключительными для группы.Например:

Column1    Column2    Column3 
Name1      Some Val   Criteria1
Name1      Unwanted   Also Unwanted
Name2      Some Val2  Criteria2
Name2      Unwanted   Also Unwanted

Это может сбить с толку.Но в основном я хочу выбрать каждый Some Val на основе соответствующих Критериев для каждого Имени, поэтому я хочу, чтобы он был:

Column1    Column2    Column3
Name1      Some Val1  Criteria1
Name2      Some Val2  Criteria2

. Проблема в том, что это легко сделать, если выбрать его только изнесколько имен.Но у меня есть тысячи, что означает выписывание тысяч, имен и тысяч различных критериев.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Если вы хотите выбрать строки из группы на основе групповых критериев , вам потребуется какой-то объект, который определяет критерии для каждой группы.Это можно сделать с помощью data.frame (criteria_by_group в приведенном ниже коде).

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tibble)

df <- tribble(
  ~group_col, ~value_col, ~criteria_col,
  "Name1", "Some Val", "Criteria1",
  "Name1", "Unwanted", "Not Criteria1",
  "Name2", "Some Val2", "Criteria2", 
  "Name2", "Unwanted", "Not Criteria2"
)

criteria_by_group <- tribble(
  ~group_col, ~group_criteria,
  "Name1", "Criteria1",
  "Name2", "Criteria2"
)

df <- left_join(df, criteria_by_group, by = "group_col")

df
#> # A tibble: 4 x 4
#>   group_col value_col criteria_col  group_criteria
#>   <chr>     <chr>     <chr>         <chr>         
#> 1 Name1     Some Val  Criteria1     Criteria1     
#> 2 Name1     Unwanted  Not Criteria1 Criteria1     
#> 3 Name2     Some Val2 Criteria2     Criteria2     
#> 4 Name2     Unwanted  Not Criteria2 Criteria2

df %>%
  group_by(group_col) %>%
  filter(criteria_col == group_criteria[1])
#> # A tibble: 2 x 4
#> # Groups:   group_col [2]
#>   group_col value_col criteria_col group_criteria
#>   <chr>     <chr>     <chr>        <chr>         
#> 1 Name1     Some Val  Criteria1    Criteria1     
#> 2 Name2     Some Val2 Criteria2    Criteria2

Создано в 2019-02-27 с помощью пакета Представить (v0.2.1)

0 голосов
/ 28 февраля 2019

Используя dplyr вы можете сделать

library(dplyr)
df %>%
    group_by(Column1) %>%
    filter(str_detect(Column2, "Some Val"))
## A tibble: 2 x 3
## Groups:   Column1 [2]
#  Column1 Column2   Column3
#  <fct>   <fct>     <fct>
#1 Name1   Some Val  Criteria1
#2 Name2   Some Val2 Criteria2

Пример данных

df <- read.table(text =
    "Column1    Column2    Column3
Name1      'Some Val'   Criteria1
Name1      Unwanted   'Also Unwanted'
Name2      'Some Val2'  Criteria2
Name2      Unwanted   'Also Unwanted'", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...