【问题标题】:How to collapse/join selected factor levels across two columns in R如何在 R 中的两列中折叠/连接选定的因子级别
【发布时间】:2015-10-13 19:54:50
【问题描述】:

假设我有以下数据框:

x <-c(rep (c ("s1", "s2", "s3"),each=5 ))
y <- c(rep(c("a", "b", "c", "d", "e"), 3) )               
z<-c(1:15)    

x_name <- "dimensions"
y_name <- "aspects"
z_name<-"value"
df <- data.frame(x,y,z)
names(df) <- c(x_name,y_name, z_name)

如何在“维度”和“值”的一个新因子“x”中折叠/加入因子水平“a”、“c”、“d”,以便为新的 x 因子添加值等级。输出应如下所示:

我想使用 gsub 将 a、c、d 的名称替换为 x,然后使用聚合对它们的值求和。但是有没有更简单的方法来做到这一点?此外,如果我有其他包含 a、c、d 的列,我不确定我的解决方案是否仍然有效。
我在论坛上查看了几个相关的答案,但都没有解决这种情况。谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    先将a、c、d重命名为x,然后按维度和方面求和

    读取数据:

    df <- data.frame(dimensions = x, aspects = y, value = z, stringsAsFactors = FALSE)
    

    基础 R 解决方案:

    # if you read the data my way the following line is unnecessary
    # df$aspects <- as.character(df$aspects) 
    df[df$aspects %in% c("a","c","d"),]$aspects <- "x"
    aggregate(value ~., df, sum)
    

    结果:

      dimensions aspects value
    1         s1       b     2
    2         s2       b     7
    3         s3       b    12
    4         s1       e     5
    5         s2       e    10
    6         s3       e    15
    7         s1       x     8
    8         s2       x    23
    9         s3       x    38
    

    data.table解决方案

    require(data.table)
    DT <- setDT(df)
    DT[aspects %in% c("a","c","d"), aspects := "x"]
    DT[,sum(value), by=.(dimensions, aspects)]
    

    结果

       dimensions aspects V1
    1:         s1       x  8
    2:         s1       b  2
    3:         s1       e  5
    4:         s2       x 23
    5:         s2       b  7
    6:         s2       e 10
    7:         s3       x 38
    8:         s3       b 12
    9:         s3       e 15
    

    【讨论】:

    • 它运行良好,看起来比我最初的解决方案更简单。谢谢。
    • Pierre Lafortune,你的评论是什么意思?
    • 问题要求重新编码 'a', 'c', 'd' not 'a', 'b', 'c' - 一个简单的编辑就可以解决你的解决方案。
    • 我确实注意到了,但不管怎样都可以,所以谢谢大家
    【解决方案2】:

    这是一个使用plyr::revalue(另见plyr::mapvalues)和dplyr的解决方案:

    # install.packages("plyr")
    library(dplyr)
    
    df %>%
      mutate(aspects = plyr::revalue(aspects, c("a" = "x", "c" = "x", "d" = "x"))) %>%
      group_by(dimensions, aspects) %>%
      summarise(sum_value = sum(value))
    
    #   dimensions aspects sum_value
    #       (fctr)  (fctr)     (int)
    # 1         s1       x         8
    # 2         s1       b         2
    # 3         s1       e         5
    # 4         s2       x        23
    # 5         s2       b         7
    # 6         s2       e        10
    # 7         s3       x        38
    # 8         s3       b        12
    # 9         s3       e        15
    

    【讨论】:

    • JasonAizkalns 我正在使用代码,但似乎它也添加了“b”,只留下 x(也包括 b 的值)和 e。
    • 谢谢。它仍然给了我另一个输出。我会支持它,并会尝试找出问题所在。我看到您安装了“plyr”,但请求是针对“dplyr”的。会不会是这个? (到目前为止还没有使用过 dplyr 或 plyr 所以不知道)
    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2016-12-11
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多