我有一些异常情况,我目前无法将第三方软件包下载到我的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中最简单的方法是什么?
答案 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