不使用第三方软件包,有没有办法计算分类数据计数的行百分比?

时间:2014-03-01 01:44:14

标签: r aggregate data-manipulation summarization

我有一些异常情况,我目前无法将第三方软件包下载到我的R设置中。以此为约束,有没有办法总结以下餐厅位置数据和关闭/打开状态?

我的数据上的count(business,vars=c("city","open"))给我这样的内容:

"City"       "Open"   "Frequency"
Wickenburg   False    2
Wickenburg   True     26
Wittmann     True     2
Wittmann     False    2
Youngtown    True     7
Yuma         True     1

这是一个频率表,显示特定城市中有多少餐厅都是开放式的。

我想按组找到百分比。示例输出看起来像这样

"City"       "Open"   "Frequency"    "Pct of City"
Wickenburg   False    2               7.7
Wickenburg   True     26              92.3
Wittmann     True     2               50.0
Wittmann     False    2               50.0
Youngtown    True     7               100.0
Yuma         True     1               100.0

在香草R中最简单的方法是什么?

4 个答案:

答案 0 :(得分:5)

试试这个:

transform(DF, Pct = 100 * ave(Frequency, City, FUN = prop.table))

给出:

        City  Open Frequency        Pct
1 Wickenburg False         2   7.142857
2 Wickenburg  True        26  92.857143
3   Wittmann  True         2  50.000000
4   Wittmann False         2  50.000000
5  Youngtown  True         7 100.000000
6       Yuma  True         1 100.000000

答案 1 :(得分:3)

这是基础R的完整解决方案,包括计算频率,并包括一些可重复的样本数据。

set.seed(1)
mydf <- data.frame(
  city = sample(LETTERS[1:3], 20, TRUE),
  open = sample(c("True", "False"), 20, TRUE))
head(mydf)
#   city  open
# 1    A False
# 2    B  True
# 3    B False
# 4    C  True
# 5    A  True
# 6    C  True

within(data.frame(table(mydf)), {
  Pct <- ave(Freq, city, FUN = function(x) x/sum(x) * 100)
})
#   city  open Freq      Pct
# 1    A False    2 40.00000
# 2    B False    4 57.14286
# 3    C False    2 25.00000
# 4    A  True    3 60.00000
# 5    B  True    3 42.85714
# 6    C  True    6 75.00000

答案 2 :(得分:1)

我认为这是使用tapply

的单线程
data = data.frame(City=c("Wickenburg", "Wickenburg", "Wittmann", "Wittmann", "Youngtown", "Yuma"),
                  Open=c(F, T, T, F, T, T), Frequency=c(2, 26, 2, 2, 7, 1))
data$Pct = data$Frequency / tapply(data$Frequency, data$City, sum)[data$City] * 100
data
#         City  Open Frequency        Pct
# 1 Wickenburg FALSE         2   7.142857
# 2 Wickenburg  TRUE        26  92.857143
# 3   Wittmann  TRUE         2  50.000000
# 4   Wittmann FALSE         2  50.000000
# 5  Youngtown  TRUE         7 100.000000
# 6       Yuma  TRUE         1 100.000000

答案 3 :(得分:0)

如何使用tapply,合并然后分割。我认为这可能有用:

countDF <- data.frame(count(business,vars=c("city","open")))
colnames(countDF) <- c("City", "Open", "Frequency")

tmp <- data.frame(tapply(countDF$Frequency, countDF$City, sum)

countDF <- merge(countDF, tmp, by=1) 

countDF$PctOfCity <- (countDF$Frequency / countDF$V1) * 100

countDF$V1 <- NULL