如何解决R 等价于 Stata `tabulate , generate()` 命令
我想在 R 中模仿 Stata 的 tabulate,generate()
命令的行为。如下图所示;命令的功能是双重的。首先,在我的示例中,它生成一个单向的频率计数表。其次,它使用选项 var1
中声明的前缀 (stubname) 为变量 (,generate()
) 中包含的每个值生成虚拟变量,以命名生成的虚拟变量( d_1 - d_7
)。我的问题是关于第二个功能。首选基于 R 的解决方案,但也欢迎打包依赖。
[编辑]:我的最终目标是生成一个 data.frame()
来模拟打印在屏幕上的最后一个数据集。
clear all
input var1
0
1
2
2
2
2
42
42
777
888
999999
end
tabulate var1,gen(d_)
/* var1 | Freq. Percent Cum.
------------+-----------------------------------
0 | 1 9.09 9.09
1 | 1 9.09 18.18
2 | 4 36.36 54.55
42 | 2 18.18 72.73
777 | 1 9.09 81.82
888 | 1 9.09 90.91
999999 | 1 9.09 100.00
------------+-----------------------------------
Total | 11 100.00 */
list,sep(11)
/* +--------------------------------------------------+
| var1 d_1 d_2 d_3 d_4 d_5 d_6 d_7 |
|--------------------------------------------------|
1. | 0 1 0 0 0 0 0 0 |
2. | 1 0 1 0 0 0 0 0 |
3. | 2 0 0 1 0 0 0 0 |
4. | 2 0 0 1 0 0 0 0 |
5. | 2 0 0 1 0 0 0 0 |
6. | 2 0 0 1 0 0 0 0 |
7. | 42 0 0 0 1 0 0 0 |
8. | 42 0 0 0 1 0 0 0 |
9. | 777 0 0 0 0 1 0 0 |
10. | 888 0 0 0 0 0 1 0 |
11. | 999999 0 0 0 0 0 0 1 |
+--------------------------------------------------+ */
解决方法
我猜您假设 var_1
中的每个值都是唯一的,以便您获得虚拟变量而不是 d_
字段中的计数。
你可以尝试这样的事情:
var1 <- 1:5
dummy_matrix <- vapply(var1,function(x) as.numeric(var1 == x),rep(1,5)) # create a matrix of dummy vars
colnames(dummy_matrix) <- paste0("d_",var1) # name the columns
cbind(var1,dummy_matrix) # bind to var1
输出:
var1 d_1 d_2 d_3 d_4 d_5
1 1 1 0 0 0 0
2 2 0 1 0 0 0
3 3 0 0 1 0 0
4 4 0 0 0 1 0
5 5 0 0 0 0 1
,
set.seed(123)
df = data.frame(var1 = factor(sample(10,20,TRUE)))
df = data.frame(df,model.matrix(~0+var1,df)) # 0 here is to suppress the intercept. The smallest value will be the base group--and hence will be dropped.
names(df)[-1] = paste0('d_',1:(ncol(df)-1))
df
var1 d_1 d_2 d_3 d_4 d_5 d_6 d_7 d_8 d_9
1 3 0 1 0 0 0 0 0 0 0
2 3 0 1 0 0 0 0 0 0 0
3 10 0 0 0 0 0 0 0 0 1
4 2 1 0 0 0 0 0 0 0 0
5 6 0 0 0 0 1 0 0 0 0
6 5 0 0 0 1 0 0 0 0 0
7 4 0 0 1 0 0 0 0 0 0
8 6 0 0 0 0 1 0 0 0 0
9 9 0 0 0 0 0 0 0 1 0
10 10 0 0 0 0 0 0 0 0 1
11 5 0 0 0 1 0 0 0 0 0
12 3 0 1 0 0 0 0 0 0 0
13 9 0 0 0 0 0 0 0 1 0
14 9 0 0 0 0 0 0 0 1 0
15 9 0 0 0 0 0 0 0 1 0
16 3 0 1 0 0 0 0 0 0 0
17 8 0 0 0 0 0 0 1 0 0
18 10 0 0 0 0 0 0 0 0 1
19 7 0 0 0 0 0 1 0 0 0
20 10 0 0 0 0 0 0 0 0 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。