R中的数据框列总数

时间:2015-07-30 06:43:14

标签: r

我的数据是这样的(我使用collectionView:cellForItemAtIndexpath:函数派生)

table

我想要的只是行总数,所以要在底部创建一个新行,然后在列freq中它将显示35,在col百分比中它将显示100.我无法找到解决方案。由于第一列是字符串,responses freq percent A 9 25.7 B 13 37.1 C 10 28.6 D 3 8.6 无法正常工作。

5 个答案:

答案 0 :(得分:2)

一种选择是转换为'矩阵'并使用addmargins将列总和作为底部的单独行。但是,这将是一个矩阵。

  m1 <- as.matrix(df1[-1])
  rownames(m1) <- df1[,1]
  res <- addmargins(m1, 1)
  res
  #    freq percent
  #A      9    25.7
  #B     13    37.1
  #C     10    28.6
  #D      3     8.6
  #Sum   35   100.0

如果要转换为data.frame

data.frame(responses=rownames(res), res)

另一种选择是获取sum colSums的数字列(df1[-1])(我认为这是OP陷入困境的地方,即应用{{1在整个数据集而不是子集上),使用colSums列创建一个新的data.frame,并使用原始数据集创建responses

rbind

数据

 rbind(df1, data.frame(responses='Total', as.list(colSums(df1[-1]))))
 #    responses freq percent
 #1         A    9    25.7
 #2         B   13    37.1
 #3         C   10    28.6
 #4         D    3     8.6
 #5     Total   35   100.0

答案 1 :(得分:2)

@akrun我发布了它,但你已经做了同样的事情。如果我错了,请纠正我,我想我们可以在不创建新数据框或使用as.list的情况下解决这个问题。

rbind(df1, c("Total", colSums(df1[-1])))

输出:

 responses freq percent
1         A    9    25.7
2         B   13    37.1
3         C   10    28.6
4         D    3     8.6
5     Total   35     100

sqldf

保留数据框的类。

library(sqldf)
sqldf("SELECT * FROM df1
      UNION 
      SELECT 'Total', SUM(freq) AS freq, SUM(percent) AS percent FROM df1") 

答案 2 :(得分:2)

这可能是相关的,使用SciencesPo包,请参阅此示例:

library(SciencesPo)
tab(mtcars,gear,cyl) 

#output

=================================
              cyl                
      --------------------       
gear    4      6      8    Total 
---------------------------------
3          1      2     12     15
        6.7%    13%    80%   100%
4          8      4      0     12
       66.7%    33%     0%   100%
5          2      1      2      5
       40.0%    20%    40%   100%
---------------------------------
Total     11      7     14     32
       34.4%    22%    44%   100%
=================================

Chi-Square Test for Independence

Number of cases in table: 32 
Number of factors: 2 
Test for independence of all factors:
    Chisq = 18.036, df = 4, p-value = 0.001214
    Chi-squared approximation may be incorrect
                    X^2 df   P(> X^2)
Likelihood Ratio 23.260  4 0.00011233
Pearson          18.036  4 0.00121407

Phi-Coefficient   : NA 
Contingency Coeff.: 0.6 
Cramer's V        : 0.531 

答案 3 :(得分:1)

或者,您也可以在R-base中使用 margin.table rbind 功能。两条线,瞧......

PS:这里的线路比较长,因为我正在重建数据,但你知道我的意思: - )

数据

df1 <- matrix(c(9,25.7,13,37.1,10,28.6,3,8.6),ncol=2,byrow=TRUE)
colnames(df1) <- c("freq","percent") 
rownames(df1) <- c("A","B","C","D") 

创建总计算

Total <- margin.table(df1,2)

将总计算与原始数据相结合

df2 <- rbind(df,Total)
df2

答案 4 :(得分:0)

不太优雅,但它完成了工作,请提供可重复的数据框,这样我们就不必先构建它们

data = data.frame(letters[1:4], c(9,13,10,3), c(25.7,37.1, 28.6, 8.6))
colnames(data) = c("X","Y","Z")

data = rbind(data[,1:3], matrix(c("Sum",lapply(data[,2:3], sum)), nrow = 1)[,1:3])