基于互变量将观察结果组合成一个新变量
Combining observations into a new variable based on a mutual variable
我合并了来自同一调查的两个数据集。一种是个人层面 selectedindividual
,一种是家庭层面 selectedhousehold
。我使用以下代码合并了两个数据集(使用 dplyr
中的 left_join
):
mergeddf <- left_join(selectedhousehold, selectedindividual) %>% group_by(shserial) %>% slice (1)
shserial
变量是两个数据集中存在的主键。每个家庭都有一个特定的号码。每个家庭最多可以包含两个人,因此他们将拥有相同的shserial
。因为我想在家庭层面进行分析,所以我不想只在数据集上使用 merge()
(因为这重复了有 2 个人的家庭的观察结果,例如,我的因变量之一家庭层面 - GrossIncome
)。
不过我还有一个问题:
我有一个个人级别的变量,WrkStat
(具有三个级别,working
、NWork
、FTEduc
),我想将其包含在我的模型中.我用于合并数据集的代码只保留了两个具有相同数字的 shserial 的第一个观察结果(我假设,至少,我无法弄清楚 slice()
是如何工作的)。这不利于我的分析,因为我不想 select 随机选择一个家庭中的两个人之一。为了说明,WrkStat
在非合并和合并数据帧中的摘要统计信息:
> summary(selectedindividual$WrkStat)
working FTEduc NWork NA's
324 748 2455 201
> summary(mergeddf$WrkStat)
working FTEduc NWork NA's
251 77 2097 5
作为解决方案,我想我会创建一个新变量 WrkStat2
,它结合了一个家庭中两个人的观察结果。我想在 before 合并数据集之前创建这个变量。
我希望我可以根据相互 shserial
号码创建这个新变量。
但是,我不知道该怎么做。
编辑:
我的数据框的结构:
selectedindividual <- structure(list(`shserial` = c(1010574, 1010574,
1011104, 1011104, 1011109, 1011109, 1011134, 1011134, 1011142,
1011143, 1011148, 1011148, 1011154, 1011154, 1011156, 1011171,
1011171, 1011174, 1011174, 1011182), `WrkStat` = structure(c(3L,
2L, 3L, 2L, 3L, NA, 1L, NA, 3L, 3L, 3L, 2L, 3L, 2L, 3L, 1L, 2L,
3L, NA, 3L), .Label = c("working", "FTEduc", "NWork"), class = "factor")), row.names = c(NA,
-20L), class = c("tbl_df", "tbl", "data.frame"))
给出这个输出:
shserial WrkStat
<dbl> <fct>
1 1010574 NWork
2 1010574 FTEduc
3 1011104 NWork
4 1011104 FTEduc
5 1011109 NWork
6 1011109 NA
7 1011134 working
8 1011134 NA
9 1011142 NWork
10 1011143 NWork
11 1011148 NWork
12 1011148 FTEduc
13 1011154 NWork
14 1011154 FTEduc
15 1011156 NWork
16 1011171 working
17 1011171 FTEduc
18 1011174 NWork
我想要这个输出:
shserial WrkStat2
<dbl> <fct>
1 1010574 NWork/FTEduc
2 1011104 NWork/FTEduc
3 1011109 NWork
4 1011134 working
5 1011142 NWork
6 1011143 NWork
7 1011148 NWork/FTEduc
8 1011154 NWork/FTEduc
9 1011156 NWork
10 1011171 working/FTEduc
11 1011174 NWork
(这也删除了不属于它自己的 NA(因此不是组合的 WrkStat),尽管我认为如果在此过程中删除所有 NA 也很好)。
另一个编辑:
WrkStat2
应具有以下标签:
"working/working",
"working/NWork",
"working/FTEduc",
"NWork/NWork",
"NWork/FTEduc",
"FTEduc/FTEduc",
"working",
"NWork",
"FTEduc"
如果有什么不清楚或者不可能完成所有事情,我很抱歉(让我知道)。我不擅长逻辑思考,并且为此苦苦挣扎了几天。
我们可以删除 NA
个值和每个 shserial
的 paste
WrkStat
。
这可以在 base R 中完成:
aggregate(WrkStat~shserial, selectedindividual, function(x)
paste0(na.omit(x), collapse = "/"))
# shserial WrkStat
#1 1010574 NWork/FTEduc
#2 1011104 NWork/FTEduc
#3 1011109 NWork
#4 1011134 working
#5 1011142 NWork
#6 1011143 NWork
#7 1011148 NWork/FTEduc
#8 1011154 NWork/FTEduc
#9 1011156 NWork
#10 1011171 working/FTEduc
#11 1011174 NWork
#12 1011182 NWork
dplyr
:
library(dplyr)
selectedindividual %>%
group_by(shserial) %>%
summarise(WrkStat2 = paste0(na.omit(WrkStat), collapse = "/"))
或在 data.table
中:
library(data.table)
setDT(selectedindividual)[, (WrkStat = paste0(na.omit(WrkStat), collapse = "/")),
shserial]
我合并了来自同一调查的两个数据集。一种是个人层面 selectedindividual
,一种是家庭层面 selectedhousehold
。我使用以下代码合并了两个数据集(使用 dplyr
中的 left_join
):
mergeddf <- left_join(selectedhousehold, selectedindividual) %>% group_by(shserial) %>% slice (1)
shserial
变量是两个数据集中存在的主键。每个家庭都有一个特定的号码。每个家庭最多可以包含两个人,因此他们将拥有相同的shserial
。因为我想在家庭层面进行分析,所以我不想只在数据集上使用 merge()
(因为这重复了有 2 个人的家庭的观察结果,例如,我的因变量之一家庭层面 - GrossIncome
)。
不过我还有一个问题:
我有一个个人级别的变量,WrkStat
(具有三个级别,working
、NWork
、FTEduc
),我想将其包含在我的模型中.我用于合并数据集的代码只保留了两个具有相同数字的 shserial 的第一个观察结果(我假设,至少,我无法弄清楚 slice()
是如何工作的)。这不利于我的分析,因为我不想 select 随机选择一个家庭中的两个人之一。为了说明,WrkStat
在非合并和合并数据帧中的摘要统计信息:
> summary(selectedindividual$WrkStat)
working FTEduc NWork NA's
324 748 2455 201
> summary(mergeddf$WrkStat)
working FTEduc NWork NA's
251 77 2097 5
作为解决方案,我想我会创建一个新变量 WrkStat2
,它结合了一个家庭中两个人的观察结果。我想在 before 合并数据集之前创建这个变量。
我希望我可以根据相互 shserial
号码创建这个新变量。
但是,我不知道该怎么做。
编辑:
我的数据框的结构:
selectedindividual <- structure(list(`shserial` = c(1010574, 1010574,
1011104, 1011104, 1011109, 1011109, 1011134, 1011134, 1011142,
1011143, 1011148, 1011148, 1011154, 1011154, 1011156, 1011171,
1011171, 1011174, 1011174, 1011182), `WrkStat` = structure(c(3L,
2L, 3L, 2L, 3L, NA, 1L, NA, 3L, 3L, 3L, 2L, 3L, 2L, 3L, 1L, 2L,
3L, NA, 3L), .Label = c("working", "FTEduc", "NWork"), class = "factor")), row.names = c(NA,
-20L), class = c("tbl_df", "tbl", "data.frame"))
给出这个输出:
shserial WrkStat
<dbl> <fct>
1 1010574 NWork
2 1010574 FTEduc
3 1011104 NWork
4 1011104 FTEduc
5 1011109 NWork
6 1011109 NA
7 1011134 working
8 1011134 NA
9 1011142 NWork
10 1011143 NWork
11 1011148 NWork
12 1011148 FTEduc
13 1011154 NWork
14 1011154 FTEduc
15 1011156 NWork
16 1011171 working
17 1011171 FTEduc
18 1011174 NWork
我想要这个输出:
shserial WrkStat2
<dbl> <fct>
1 1010574 NWork/FTEduc
2 1011104 NWork/FTEduc
3 1011109 NWork
4 1011134 working
5 1011142 NWork
6 1011143 NWork
7 1011148 NWork/FTEduc
8 1011154 NWork/FTEduc
9 1011156 NWork
10 1011171 working/FTEduc
11 1011174 NWork
(这也删除了不属于它自己的 NA(因此不是组合的 WrkStat),尽管我认为如果在此过程中删除所有 NA 也很好)。
另一个编辑:
WrkStat2
应具有以下标签:
"working/working",
"working/NWork",
"working/FTEduc",
"NWork/NWork",
"NWork/FTEduc",
"FTEduc/FTEduc",
"working",
"NWork",
"FTEduc"
如果有什么不清楚或者不可能完成所有事情,我很抱歉(让我知道)。我不擅长逻辑思考,并且为此苦苦挣扎了几天。
我们可以删除 NA
个值和每个 shserial
的 paste
WrkStat
。
这可以在 base R 中完成:
aggregate(WrkStat~shserial, selectedindividual, function(x)
paste0(na.omit(x), collapse = "/"))
# shserial WrkStat
#1 1010574 NWork/FTEduc
#2 1011104 NWork/FTEduc
#3 1011109 NWork
#4 1011134 working
#5 1011142 NWork
#6 1011143 NWork
#7 1011148 NWork/FTEduc
#8 1011154 NWork/FTEduc
#9 1011156 NWork
#10 1011171 working/FTEduc
#11 1011174 NWork
#12 1011182 NWork
dplyr
:
library(dplyr)
selectedindividual %>%
group_by(shserial) %>%
summarise(WrkStat2 = paste0(na.omit(WrkStat), collapse = "/"))
或在 data.table
中:
library(data.table)
setDT(selectedindividual)[, (WrkStat = paste0(na.omit(WrkStat), collapse = "/")),
shserial]