如何将R中的colSums结果转换为数据框

6

我需要获取所有列的列和,并将结果作为两列(列名和它们的总和)出现在数据框中。但是,如果我这样做,列名似乎会变成索引而不是一个列本身。

demo=data.frame(a=runif(10),b=runif(10,max=2),c=runif(10,max=3))
as.data.frame(colSums(demo))

不期望的结果:
   colSums(demo)
a      4.083571
b     11.698794
c     14.082574

期望的结果:

colname colSums(demo)
a      4.083571
b     11.698794
c     14.082574

如何在保持左侧列的形状不变的情况下添加标题?谢谢。
8个回答

8

一种可能的方法是使用t()函数来转置结果。

data.frame(t(colSums(demo)))
                    a        b        c
colSums.demo. 5.782475 10.46739 18.46751
为了更改输出中行的名称,我们可以使用rownames,例如像这样:
`rownames<-`(data.frame(t(colSums(demo))), "myColsum")
             a        b        c
myColsum 5.782475 10.46739 18.46751

在我看来,最好的解决方案是保持“colsums”的格式。 - Kots

6
您可以使用 stack()setNames() 函数来实现您想要的输出:
setNames(nm=c('colname','colSums(demo)'),stack(colSums(demo))[2:1]);
##   colname colSums(demo)
## 1       a      4.083571
## 2       b     11.698794
## 3       c     14.082574

不错的setNames和stack的封装,我认为值得解释一下[2:1]符号的使用,因为它在setNames或stack的help()中都没有涉及(我认为它是在stack中操作),如果没有这个符号,会导致呈现顺序反转,即colSums(demo)会在colname之前。 - Chris

5
> demo = data.frame(a=runif(10),b=runif(10,max=2),c=runif(10,max=3))
> df <- data.frame(colname = names(demo),colSums_demo=colSums(demo))
> print(df, row.names=F)
  colname colSums_demo
        a     4.754546
        b    12.488904
        c    18.152095

3

试试这个:

as.data.frame(lapply(demo, sum))

结果如下:
         a        b       c
1 6.400121 10.16047 10.6528

data.frame much faster than as.data.frame - Kots

2
现在有一个简单的方法可以使用tidyverse函数enframe()来完成这个任务。
enframe(colSums(demo))

如果您想使用示例中的列名,可以将它们设置为参数。

demo %>% colSums() %>% enframe(name = "colname", value = "colSums(demo)")

1
我们可以使用带有 meltdata.table
library(data.table)
melt(setDT(demo)[, lapply(.SD, sum)])

0
一个新的tidyverse方式!
demo %>%
    summarise(across(where(is.numeric)
                           ,sum))

如果你想按列名进行长格式转换,可以使用 tidyr::pivot_longer


0
demo=data.frame(a=runif(10),b=runif(10,max=2),c=runif(10,max=3))
as.data.frame(colSums(demo))

new_table<-as.data.frame(colSums(demo))

new_table %>% 
  rownames_to_column(var ="colname")

1
请参见“完全基于代码的答案解释”。虽然这可能在技术上是正确的,但它并没有解释为什么它可以解决问题或应该被选为答案。我们应该在帮助解决问题的同时进行教育。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接