R频率表基于存在/不存在样本

时间:2014-12-08 13:29:55

标签: r

我不太确定如何搜索我感兴趣的主题,所以如果已经提出这个问题,我会提前道歉。与频率表相关的问题没有解决我的疑问。

我有以下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约。 42户家庭,5个能源和27个州。

1 个答案:

答案 0 :(得分:4)

我们可以在d1中查找ElectricityFuelwood为正(1)的行。使用该逻辑索引,我们可以更改ElectricityFuelwood行中的值为负值或2的值。然后,使用创建的ElecticityANDFuelwood创建其他列index。使用widelong更改为melt表单,仅使用Statevariable两个列进行更改,使用tableprop.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 Arenburg提供的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