我对R中的table()
函数有疑问。我想添加一个额外的列来显示table()
计算的百分比。我有一个这样的数据框:
delta=data.frame(x1=c("x001","x001","x002","x002","x001","x001","x002"),x2=c(1,2,1,1,1,1,1))
当我为此数据框计算table()
时,我得到了这个:
table(delta$x1,delta$x2)
1 2
x001 3 1
x002 3 0
可以在此表中添加百分比,或者R中有任何函数或包来计算如下内容:
1 2 Number Percentage
x001 3 1 4 0.5714286
x002 3 0 3 0.4285714
感谢您的帮助。
答案 0 :(得分:4)
以下是使用sum()
和rowSums()
的快速解决方案:
> tbl <- table(delta)
> (tbl <- cbind(tbl, rowSums(tbl), rowSums(tbl) / sum(tbl)))
1 2
x001 3 1 4 0.571
x002 3 0 3 0.429
您可以使用colnames()
添加列名; e.g:
> colnames(tbl) <- c("1", "2", "N", "Pct")
> tbl
1 2 N Pct
x001 3 1 4 0.571
x002 3 0 3 0.429
答案 1 :(得分:4)
您可以使用prop.table
和addmargins
tbl <- table(delta$x1,delta$x2)
prop.table(tbl)
# 1 2
# x001 0.4285714 0.1428571
# x002 0.4285714 0.0000000
addmargins(tbl)
# 1 2 Sum
# x001 3 1 4
# x002 3 0 3
# Sum 6 1 7
修改强>
当然你可以做点什么
rowSums(prop.table(tbl))
x001 x002
0.5714286 0.4285714
但我的回答是说R中有一些内置函数可以完成table
函数。
答案 2 :(得分:1)
计算不是很棘手 你可能会绊倒的是该表不会直接转换为data.frame。至少不是你想要它的方式。这是一步一步的分解。
# this is the basic table, we want it as a data.frame
delCounts <- table(delta)
# you need to convert the table to a matrix, before converting to a data.frame
results <- data.frame(matrix(delCounts, nrow=nrow(delCounts)))
# you may want to preserve the names. Have a look:
dimnames(delCounts) # first are the column names, then row names
colnames(results) <- dimnames(delCounts)[[1]]
rownames(results) <- dimnames(delCounts)[[2]]
# Now sum up and take percentages
# we can use vectorized arithmetic operations for the percentage
results$Number <- rowSums(results)
results$Percentage <- results$Number / sum(results$Number)
# we might want to round instead
results$Percentage <- round(results$Number / sum(results$Number)*100, 2)
results
# x001 x002 Number Percentage
# 1 3 1 4 57.14
# 2 3 0 3 42.86