【问题标题】:Perform operations on multiple dummy variables对多个虚拟变量执行操作
【发布时间】:2015-02-19 16:02:17
【问题描述】:

给定一个数据框,

ID <- c("a","b","b","c","c","c","d","d","d")
dummy1 <- c(1,0,1,1,0,0,1,1,0)
dummy2 <- c(0,0,0,0,1,1,1,1,1)
dummy3 <- c(1,0,0,1,1,0,0,1,1)
df <- data.frame(ID,dummy1,dummy2,dummy3)

  ID dummy1 dummy2 dummy3
1  a      1      0      1
2  b      0      0      0
3  b      1      0      0
4  c      1      0      1
5  c      0      1      1
6  c      0      1      0
7  d      1      1      0
8  d      1      1      1
9  d      0      1      1

我想计算一组多个虚拟变量中每个变量的平均值。

这就像在多行上使用tapply、aggregate 或ave(x,y,mean) 函数,同时创建一个新变量/列。不幸的是,我事先不知道虚拟变量的数量。我唯一知道的是虚拟变量从第 2 列开始。我的结果如下所示:

ID     m_dummy1  m_dummy2  m_dummy3   m_dummy5...
a      1         0         1
b      0         0         0
c      0.33      0.66      0.66
d      0.66      1         0.66

或者像这样:

ID     m_dummy1  m_dummy2  m_dummy3   m_dummy5...
a ...  1         0         1
b ...  0         0         0
b ...  0         0         0    
c ...  0.33      0.66      0.66
c ...  0.33      0.66      0.66
c ...  0.33      0.66      0.66
d ...  0.66      1         0.66    
d ...  0.66      1         0.66
d ...  0.66      1         0.66

在我的场景中,我有从 1 到 x 的未知数量的假人,所以我可能只有 dummy2,但也许我有“dummy1”和虚构的假人“dummy5”和“dummy6”。 完美的解决方案将允许我为第 2 列之后的所有列创建“m_dummy”列。 因此,如果 dummy3 丢失或有额外的 dummy4 dummy4 &lt;- c(1,0,0,0,0,0,0,1,0)

,它也可以工作

【问题讨论】:

    标签: r dummy-data


    【解决方案1】:

    这里有几个data.table 方法可以让您轻松地选择任何一种方法:

    library(data.table)
    
    as.data.table(df)[, lapply(.SD, mean), by = ID]
    #    ID    dummy1    dummy2    dummy3
    # 1:  a 1.0000000 0.0000000 1.0000000
    # 2:  b 0.5000000 0.0000000 0.0000000
    # 3:  c 0.3333333 0.6666667 0.6666667
    # 4:  d 0.6666667 1.0000000 0.6666667
    
    as.data.table(df)[, names(df)[-1] := lapply(.SD, mean), by = ID][]
    #    ID    dummy1    dummy2    dummy3
    # 1:  a 1.0000000 0.0000000 1.0000000
    # 2:  b 0.5000000 0.0000000 0.0000000
    # 3:  b 0.5000000 0.0000000 0.0000000
    # 4:  c 0.3333333 0.6666667 0.6666667
    # 5:  c 0.3333333 0.6666667 0.6666667
    # 6:  c 0.3333333 0.6666667 0.6666667
    # 7:  d 0.6666667 1.0000000 0.6666667
    # 8:  d 0.6666667 1.0000000 0.6666667
    # 9:  d 0.6666667 1.0000000 0.6666667
    

    上面的基本 R 等效项是:

    aggregate(. ~ ID, df, mean)
    

    和

    df[-1] <- lapply(df[-1], function(x) ave(x, df[[1]], FUN = mean))
    

    【讨论】:

    • 感谢您向我展示了获得我发布的所需结果的方法
    【解决方案2】:

    您可以从dplyr 尝试summarise_each 或mutate_each

    library(dplyr)
    df %>% 
        group_by(ID) %>% 
        summarise_each(funs(mean), starts_with('dummy'))
    

    【讨论】:

    • 多么快速而有帮助的答案,非常感谢!有没有办法用这个解决方案指定第一列(第二列),而不是starts_with('dummy')?
    • @MarkusRehm 是的,有几个选项。请查看?select
    • 我看到了特殊功能,但没有一个是指列号。我也尝试过starts_with(df[[2]])) 之类的东西,但它们都不起作用。我可以用one_of() 以某种方式解决这个问题,但这并不理想。我以前没有使用?select 的经验,所以非常感谢您的提示。
    • @MarkusRehm 假设您想要第 2 列和第 3 列,df %&gt;% group_by(ID) %&gt;% summarise_each(funs(mean), 2:3)
    • @MarkusRehm 试试df %&gt;% group_by(ID) %&gt;% summarise_each(funs(mean), 2:ncol(df))
    猜你喜欢
    • 2023-01-31
    • 2013-02-13
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2014-07-20
    • 2020-09-11
    • 2019-06-23
    相关资源
    最近更新 更多