我们如何检测在 R 中具有不同结果的观察结果?

How can we detect observations having different outcomes in R?

我在这个表格中有大量数据,还有更多其他列。所以我有一份 2011 年在一个国家工作并在 2012 年搬到另一个国家的人员名单。

Name  Work_{2011}     Work_{2012}     Wage_{2011}    Wage_{2012} 
  
Jack     US              UK            5387           35353
Bill     US              UK            43534          5343
Emma     US              FRANCE        34534          53455
Brand    US              FRANCE        64545          1343
Luigui   US              FRANCE        15343          3144
Ella     US              FRANCE        64545          1343       
Lucie    France          SPAIN         84545          1343
Maria    France          SPAIN         984545         1343
Grec     Italy           US            4545           1343

我想保留对每次出发的目的地份额最大的观察结果。我要:

Name  Work_{2011}     Work_{2012}     Wage_{2011}    Wage_{2012} 
  
Emma     US              FRANCE        34534          53455
Brand    US              FRANCE        64545          1343
Luigui   US              FRANCE        15343          3144
Ella     US              FRANCE        64545          1343       
Lucie    France          SPAIN         84545          1343
Maria    France          SPAIN         984545         1343
Grec     Italy           US            4545           1343

我不是 100% 确定这会满足您的需求,但也许会对您有所帮助。了解有关您的数据的更多详细信息可能会有所帮助,包括您的数据集有多大、您的列如何按年份组织等。

在此示例中,您可以使用 tidyverse 中的 dplyr。首先,您可以 group_by Work_2011 (我从列名中删除了大括号),并且 filter 其中 Work_2012 的不同值的数量大于 1。这意味着多个目的地。

其次,您可以 group_by Work_2011Work_2012 来确定每个目的地的国家/地区数量。这将在一秒钟内提供帮助 filter.

再一次,如果这是你感兴趣的方向,请告诉我。

library(dplyr)

df %>%
  group_by(Work_2011) %>%
  filter(n_distinct(Work_2012) > 1) %>%
  group_by(Work_2011, Work_2012) %>%
  mutate(numctry = n()) %>%
  group_by(Work_2011) %>%
  filter(numctry == max(numctry))

输出

  Name   Work_2011 Work_2012 numctry
  <chr>  <chr>     <chr>       <int>
1 Emma   US        FRANCE          4
2 Brand  US        FRANCE          4
3 Luigui US        FRANCE          4
4 Ella   US        FRANCE          4

编辑 (1/13/21):根据编辑的问题,我们可以进一步简化代码。

首先计算每个国家/地区的目的地数量,我们称之为 dest_per_cntry。这将是一个新专栏。 Jack 和 Bill 为 2。Emma、Brand、Luigui 和 Ella 为 4。

那么,您可以group_by只考虑2011年的国家。对于 Work_2011 列中的每个国家/地区,仅保留(或 filter)那些 dest_per_cntry 与该国家/地区的最大目的地数相同的国家/地区。请注意,如果存在“并列”,则仍将保留具有最大目的地的所有行。

library(tidyverse)

df %>%
  group_by(Work_2011, Work_2012) %>%
  mutate(dest_per_cntry = n()) %>%
  group_by(Work_2011) %>%
  filter(dest_per_cntry == max(dest_per_cntry))

输出

  Name   Work_2011 Work_2012 Wage_2011 Wage_2012 dest_per_cntry
  <chr>  <chr>     <chr>         <int>     <int>          <int>
1 Emma   US        FRANCE        34534     53455              4
2 Brand  US        FRANCE        64545      1343              4
3 Luigui US        FRANCE        15343      3144              4
4 Ella   US        FRANCE        64545      1343              4
5 Lucie  France    SPAIN         84545      1343              2
6 Maria  France    SPAIN        984545      1343              2
7 Grec   Italy     US             4545      1343              1

数据

df <- structure(list(Name = c("Jack", "Bill", "Emma", "Brand", "Luigui", 
"Ella", "Lucie", "Maria", "Grec"), Work_2011 = c("US", "US", 
"US", "US", "US", "US", "France", "France", "Italy"), Work_2012 = c("UK", 
"UK", "FRANCE", "FRANCE", "FRANCE", "FRANCE", "SPAIN", "SPAIN", 
"US"), Wage_2011 = c(5387L, 43534L, 34534L, 64545L, 15343L, 64545L, 
84545L, 984545L, 4545L), Wage_2012 = c(35353L, 5343L, 53455L, 
1343L, 3144L, 1343L, 1343L, 1343L, 1343L)), class = "data.frame", row.names = c(NA, 
-9L))