如果这是一个基本问题,我很抱歉,但可以从数据表中创建频率分布,如:
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的人,所以我有点盲目地解决这个问题。
答案 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