我们如何检测在 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_2011
和 Work_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))
我在这个表格中有大量数据,还有更多其他列。所以我有一份 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_2011
和 Work_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))