【问题标题】:Is there a function in R that both bind_rows() and bind_cols()?R 中是否有一个函数同时具有 bind_rows() 和 bind_cols()?
【发布时间】:2020-12-17 06:35:35
【问题描述】:

我有一个数据框,我想获取每行的总和以及每列的频率。我尝试使用表格和摘要,但没有得到正确的结果。

这里是示例数据集:

      A B C D E
      0 1 0 1 0
      1 0 0 1 1
      1 0 0 0 1
      1 1 1 0 0
      0 1 1 0 1
      1 1 0 1 0
      1 0 0 0 0

预期输出:

         A B C D E Sum
         0 1 0 1 0  2
         1 0 0 1 1  3
         1 0 0 0 1  2
         1 1 1 0 0  3
         0 1 1 0 1  3
         1 1 0 1 0  3
         1 0 0 0 0  1
 freq(1) 5 4 2 3 3
 freq(0) 2 3 5 4 4

我该怎么做?谢谢!

【问题讨论】:

  • 你可以使用addmarginsaddmargins(as.matrix(df1)) 会接近你想要的
  • 嗨 Akrun,当我应用 addmargins 时,它给了我这个消息。 FUN(newX[, i], ...) 中的错误:参数的“类型”(列表)无效然后我尝试取消列出,并在 FUN[[i]] 中得到此错误:下标超出范围
  • 它需要matrix,就像 Ian 的帖子中一样
  • 非常感谢 :) @akrun
  • @akrun 试图通过发表评论来帮助我,您可以更快地给出答案。谢谢你们的帮助!

标签: r dataframe


【解决方案1】:

除了@Ian Campbell 中的addmargins,另一个选项是adorn_totals

library(dplyr)
library(janitor)
library(tibble)
rownames_to_column(df1, 'rn') %>% 
       adorn_totals(c('row', 'col')) %>% 
       add_row(rn = 'Total_Zero', !!! colSums(df1 == 0))

-输出

#         rn A B C D E Total
#          1 0 1 0 1 0     2
#          2 1 0 0 1 1     3
#          3 1 0 0 0 1     2
#          4 1 1 1 0 0     3
#          5 0 1 1 0 1     3
#          6 1 1 0 1 0     3
#          7 1 0 0 0 0     1
#      Total 5 4 2 3 3    17
# Total_Zero 2 3 5 4 4    NA

数据

df1 <- structure(list(A = c(0L, 1L, 1L, 1L, 0L, 1L, 1L), B = c(1L, 0L, 
0L, 1L, 1L, 1L, 0L), C = c(0L, 0L, 0L, 1L, 1L, 0L, 0L), D = c(1L, 
1L, 0L, 0L, 0L, 1L, 0L), E = c(0L, 1L, 1L, 0L, 1L, 0L, 0L)),
class = "data.frame", row.names = c(NA, 
-7L))

【讨论】:

  • 许多欣赏@akrun :)
  • @almo 很高兴为您提供帮助。谢谢
【解决方案2】:

正如@akrun 在我格式化输出时指出的那样,来自基本 R 的 addmargins 是一种选择:

addmargins(as.matrix(data))
    A B C D E Sum
    0 1 0 1 0   2
    1 0 0 1 1   3
    1 0 0 0 1   2
    1 1 1 0 0   3
    0 1 1 0 1   3
    1 1 0 1 0   3
    1 0 0 0 0   1
Sum 5 4 2 3 3  17

【讨论】:

  • @lan Campbell,谢谢。有用。但我无法得到完整的结果。 [达到 getOption("max.print") -- 省略 2 行 ] 因为表的行太多。我怎样才能得到总和行?
  • @almo,这只是因为输出在您的终端中被截断。将其分配给新对象并根据需要查看headtail
  • 你期望输出如何?如果你不需要这种类型的输出,你可以使用colSums(data)rowSums(data)
  • 或者,margin.table(as.matrix(data), 1) 用于行,margin.table(as.matrix(data), 2) 用于列。
  • 另一个选项是library(janitor); library(tibble);rownames_to_column(df1, 'rn') %&gt;% adorn_totals(c('row', 'col'))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 2017-08-23
  • 2022-07-07
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多