我的数据是这样的(我使用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
无法正常工作。
答案 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
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])