我不太确定如何搜索我感兴趣的主题,所以如果这个问题已经被问到,我提前道歉。与频率表有关的问题并没有解决我的疑问。
我有以下 df,其中 1
表示积极的结果,2
表示消极的结果:
d1 <- data.frame( Household = c(1:5), State = c("AL","AL","AL","MI","MI"), Electricity = c(1,1,1,2,2),
Fuelwood = c(2,2,1,1,1))
我想制作一个频率表,我可以在其中确定使用Eletricity,Fuelwood和Electricity + Fuelwood的人的百分比,例如df2
:
d2 <- data.frame (State = c("AL", "MI"), Electricity = c(66.6,0), Fuelwood = c(0,100), ElectricityANDFuelwood = c(33.3,0))
请考虑我真正的df有大约42k个家庭,5个能源和27个州。
我们可以在d1
中查找Electricity
和Fuelwood
为正的行(1
)。 使用该逻辑索引,我们可以更改 Electricity
和 Fuelwood
行中的值 正数到负数或2
. 然后,使用已创建的index
创建其他列ElecticityANDFuelwood
。 使用melt
从wide
变为long
形式,只子集两列State
和variable
,使用table
和prop.table
来计算频率和相对频率。
indx <- with(d1, Electricity==1 & Fuelwood==1)
d1[indx,3:4] <- 2
dT <- transform(d1, ElectricityANDFuelwood= (indx)+0)[-1]
library(reshape2)
dT1 <- subset(melt(dT, id.var='State'), value==1, select=1:2)
round(100*prop.table(table(dT1), margin=1),2)
# variable
#State Electricity Fuelwood ElectricityANDFuelwood
# AL 66.67 0.00 33.33
# MI 0.00 100.00 0.00
或者@David阿伦堡贡献的data.table
解决方案
library(data.table)
d2 <- as.data.table(d1[-1])[, ElectricityANDFuelwood :=
(Electricity == 1 & Fuelwood == 1)]
d2[(ElectricityANDFuelwood), (2:3) := 2]
d2[, lapply(.SD, function(x) 100*sum(x == 1)/.N), by = State]
# State Electricity Fuelwood ElectricityANDFuelwood
#1: AL 66.66667 0 33.33333
#2: MI 0.00000 100 0.00000