R中数据帧的频率分布

时间:2013-12-09 13:41:15

标签: r

如果这是一个基本问题,我很抱歉,但可以从数据表中创建频率分布,如:

               Town 1        Town 1        Town 2     Town 2     Town 3
Fish            Yes            Yes          Yes       No          No
Crops           No             No           Yes       No          Yes
Livestock       Yes            Yes          No        No          Yes

频率分布显示每个变量的每个位置的频率?

修改

感谢那些回答的人,你是对的,如果我提供一些实际数据会更好。 好的,这与我的原始数据非常接近。正如您所看到的,城镇并不是独一无二的(因为这来自对城镇居民的调查)。因此,我希望将每个产品(鱼类,作物,牲畜等)的频率加总到每个城镇,并最终将其绘制成饼图/直方图。

类似的东西:

                Town 1       Town 2       Town 3
 Fish             2            1            0
 Crops            0            1            1
 Livestock        2            0            1

虽然我认为百分比看起来会更好吗?无论如何,谢谢你给我的任何帮助,我不知道有没有经历过R的人,所以我有点盲目地解决这个问题。

3 个答案:

答案 0 :(得分:1)

我希望我理解你的问题

# constructing your data frame
df <- data.frame(v1=c(1,0,1),v2=c(0,0,1),v3=c(1,1,0))
rownames(df) <- c('p1','p2','p3')

# calculating the distributions
t(t(df)/apply(df,2,sum))

答案 1 :(得分:1)

使用table

set.seed(1)
dat <- table(paste('Place',sample(1:3,10,rep=T),sep='_'),
      paste('Variable',sample(1:3,10,rep=T),sep='_'))

          Variable_1 Variable_2 Variable_3
  Place_1          1          0          2
  Place_2          1          1          2
  Place_3          0          2          1

编辑

ifelse(dat>0,'Yes','No')

        Variable_1 Variable_2 Variable_3
  Place_1 "Yes"      "No"       "No"      
  Place_2 "Yes"      "Yes"      "Yes"     
  Place_3 "Yes"      "No"       "Yes"     

答案 2 :(得分:1)

扩展我的评论,让我们从一些可重现的样本数据开始:

mydf <- data.frame(item = c("fish", "crops", "ls"),
                   T1 = c("Y", "N", "Y"),
                   T1 = c("Y", "N", "Y"),
                   T2 = c("Y", "Y", "N"),
                   T2 = c("N", "N", "N"),
                   T3 = c("N", "Y", "Y"), check.names = FALSE)
mydf
#    item T1 T1 T2 T2 T3
# 1  fish  Y  Y  Y  N  N
# 2 crops  N  N  Y  N  Y
# 3    ls  Y  Y  N  N  Y
来自“reshape2”的

melt将不能很好地处理重复的列名,因此首先要使它们成为唯一。

names(mydf) <- ave(names(mydf), names(mydf), 
                   FUN = function(x) paste0(x, "_", seq_along(x)))

现在,按照我的建议进行操作:

library(reshape2)
x <- melt(mydf, id.vars="item_1")  ## Melt the dataset
xY <- x[x$value == "Y", ]          ## Subset just "Y" values
## Tabulate
table(xY$item_1, sapply(strsplit(as.character(xY$variable), "_"), "[[", 1))
#        
#         T1 T2 T3
#   crops  0  1  1
#   fish   2  1  0
#   ls     2  0  1