1

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

我的数据上的 Acount(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

4 回答 4

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
于 2014-03-01T02:17:00.650 回答
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
于 2014-03-01T02:10:27.513 回答
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
于 2014-03-01T01:59:27.347 回答
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
于 2014-03-01T01:54:46.567 回答