当前位置:  开发笔记 > 编程语言 > 正文

基于R中的二进制指标动态创建变量

如何解决《基于R中的二进制指标动态创建变量》经验,为你挑选了1个好方法。

我有用户级数据,如下所示:

ID  V1 V2 V3 V4
001 1  0  1  0
002 0  1  0  1
003 0  0  0  0
004 1  1  1  0

在上面的例子中,我想要一个优雅的解决方案(可能使用tidyr)来动态重构它,使其显示为:

ID  Num_Vars Var1 Var2 Var3
001 2        V1   V3   NA
002 2        V2   V4   NA
003 0        NA   NA   NA
004 3        V1   V2   V3

请注意,此示例已简化,实际上存在许多变量.关键是要根据Var1-VarX中为任何用户填充的最大1个数来检测应创建多少变量的代码.



1> Gregor..:

这感觉就像一些相当标准的重塑:转换为long,按组操作,转换回宽:

df %>%
    gather(key = var, value = value, -ID) %>%
    group_by(ID) %>%
    filter(value != 0) %>%
    mutate(Num_Vars = n(),
           Var_Label = paste0("Var", 1:n())) %>%
    spread(key = Var_Label, value = var) %>%
    select(-value) %>%
    full_join(distinct(df, ID))
# Source: local data frame [4 x 5]
# Groups: ID [?]
# 
#      ID Num_Vars  Var1  Var2  Var3
#          
# 1     1        2    V1    V3  
# 2     2        2    V2    V4  
# 3     4        3    V1    V2    V3
# 4     3       NA      

使用此数据可重复共享dput():

df = structure(list(ID = 1:4, V1 = c(1L, 0L, 0L, 1L), V2 = c(0L, 1L, 
0L, 1L), V3 = c(1L, 0L, 0L, 1L), V4 = c(0L, 1L, 0L, 0L)), .Names = c("ID", 
"V1", "V2", "V3", "V4"), class = "data.frame", row.names = c(NA, 
-4L))

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有