如何在 R 中进行三向加权 table - 类似于 wtd.table
How to do a three-way weighted table in R - similar to wtd.table
我发现了很多与我的类似的问题,但要么他们不想要加权 tables,要么只想要双向 tables。我正在尝试两者兼顾。
使用wtd.table,我有以下代码行:
wtd.table(fulldata2$income, fulldata2$WIHH, fulldata2$hhsize, weights = fulldata2$WGTP)
此输出仅提供收入和 WIHH 加权。它也不包括 hhsize。
使用常规 table,我得到了三向格式的正确输出,但没有加权。
tab <- table(fulldata2$income, fulldata2$WIHH, fulldata2$hhsize)
tab2 <- prop.table(tab)
什么函数可以同时做三路和加权频率tables?理想情况下,也按 prop.table 那样的比例给它。
谢谢!
首先,这里有一些示例数据(尝试将这些包含在您的问题中,即使它需要创建这样的示例数据集)。请注意,我在这里使用 tidyverse
包:
test <-
tibble(
var1 = "A"
, var2 = "b"
, var3 = "alpha") %>%
complete(
var1 = c("A", "B")
, var2 = c("a", "b")
, var3 = c("alpha", "beta")) %>%
mutate(wt = 1:n())
所以,数据是:
# A tibble: 8 x 4
var1 var2 var3 wt
<chr> <chr> <chr> <int>
1 A a alpha 1
2 A a beta 2
3 A b alpha 3
4 A b beta 4
5 B a alpha 5
6 B a beta 6
7 B b alpha 7
8 B b beta 8
那么你要找的函数是xtabs
:
xtabs(wt ~ var1 + var2 + var3
, data = test)
给出:
, , var3 = alpha
var2
var1 a b
A 1 3
B 5 7
, , var3 = beta
var2
var1 a b
A 2 4
B 6 8
如果您不需要结果具有 table
class,您也可以仅使用 dplyr
中的 count
(部分tidyverse
):
test %>%
count(var1, var2, var3
, wt = wt)
用你的结果给出小提示(修改后的 data.frame):
# A tibble: 8 x 4
var1 var2 var3 n
<chr> <chr> <chr> <int>
1 A a alpha 1
2 A a beta 2
3 A b alpha 3
4 A b beta 4
5 B a alpha 5
6 B a beta 6
7 B b alpha 7
8 B b beta 8
然后您可以对其执行任何您想要的计算,例如每个 var3
:
中的百分比
test %>%
count(var1, var2, var3
, wt = wt) %>%
group_by(var3) %>%
mutate(prop_in_var3 = n / sum(n))
给出:
# A tibble: 8 x 5
# Groups: var3 [2]
var1 var2 var3 n prop_in_var3
<chr> <chr> <chr> <int> <dbl>
1 A a alpha 1 0.0625
2 A a beta 2 0.1
3 A b alpha 3 0.188
4 A b beta 4 0.2
5 B a alpha 5 0.312
6 B a beta 6 0.3
7 B b alpha 7 0.438
8 B b beta 8 0.4
我发现了很多与我的类似的问题,但要么他们不想要加权 tables,要么只想要双向 tables。我正在尝试两者兼顾。
使用wtd.table,我有以下代码行:
wtd.table(fulldata2$income, fulldata2$WIHH, fulldata2$hhsize, weights = fulldata2$WGTP)
此输出仅提供收入和 WIHH 加权。它也不包括 hhsize。
使用常规 table,我得到了三向格式的正确输出,但没有加权。
tab <- table(fulldata2$income, fulldata2$WIHH, fulldata2$hhsize)
tab2 <- prop.table(tab)
什么函数可以同时做三路和加权频率tables?理想情况下,也按 prop.table 那样的比例给它。
谢谢!
首先,这里有一些示例数据(尝试将这些包含在您的问题中,即使它需要创建这样的示例数据集)。请注意,我在这里使用 tidyverse
包:
test <-
tibble(
var1 = "A"
, var2 = "b"
, var3 = "alpha") %>%
complete(
var1 = c("A", "B")
, var2 = c("a", "b")
, var3 = c("alpha", "beta")) %>%
mutate(wt = 1:n())
所以,数据是:
# A tibble: 8 x 4
var1 var2 var3 wt
<chr> <chr> <chr> <int>
1 A a alpha 1
2 A a beta 2
3 A b alpha 3
4 A b beta 4
5 B a alpha 5
6 B a beta 6
7 B b alpha 7
8 B b beta 8
那么你要找的函数是xtabs
:
xtabs(wt ~ var1 + var2 + var3
, data = test)
给出:
, , var3 = alpha
var2
var1 a b
A 1 3
B 5 7
, , var3 = beta
var2
var1 a b
A 2 4
B 6 8
如果您不需要结果具有 table
class,您也可以仅使用 dplyr
中的 count
(部分tidyverse
):
test %>%
count(var1, var2, var3
, wt = wt)
用你的结果给出小提示(修改后的 data.frame):
# A tibble: 8 x 4
var1 var2 var3 n
<chr> <chr> <chr> <int>
1 A a alpha 1
2 A a beta 2
3 A b alpha 3
4 A b beta 4
5 B a alpha 5
6 B a beta 6
7 B b alpha 7
8 B b beta 8
然后您可以对其执行任何您想要的计算,例如每个 var3
:
test %>%
count(var1, var2, var3
, wt = wt) %>%
group_by(var3) %>%
mutate(prop_in_var3 = n / sum(n))
给出:
# A tibble: 8 x 5
# Groups: var3 [2]
var1 var2 var3 n prop_in_var3
<chr> <chr> <chr> <int> <dbl>
1 A a alpha 1 0.0625
2 A a beta 2 0.1
3 A b alpha 3 0.188
4 A b beta 4 0.2
5 B a alpha 5 0.312
6 B a beta 6 0.3
7 B b alpha 7 0.438
8 B b beta 8 0.4