我想在R data.table
中输入频率表。
数据的格式如下:
Height
Gender 3 35
m 173 125
f 323 198
...,其中表(173、125等)中的条目为计数。
我有一个2 x 2的桌子,我想将它变成两列data.table
。
数据来自对高空筑巢的鸟类的研究。问题是不同性别的鸟是否偏爱某些身高。
我认为频率表应该变成这样:
Gender height N
m 3 173
m 35 125
f 3 323
f 35 198
但是现在我不太确定。我要运行的某些模型需要逐个列出每个案例。
我可以在R中进行此转换吗?理想情况下,我想要一种在两种格式之间来回切换的方法。
答案 0 :(得分:1)
基于对“ table”的评论。
制作一个数据框(x),其中包含Gender,Height和Freq列,这将是您的N值。
使用
tabledata <- xtabs(Freq ~ ., x)
有许多基本函数可以处理此类数据,显然比单个行要紧凑得多。
也来自?loglin这个使用表的示例。
loglin(HairEyeColor, list(c(1, 2), c(1, 3), c(2, 3)))
答案 1 :(得分:1)
感谢大家(@simon和@Elin)的帮助。我以为我进行的一项民意测验将获得诸如“从4行版本开始”或“从719行版本开始”的答案,并且你们所有人都给了我一个完整的工具箱,可以从一个方法转换到另一个方法。它确实很棒,信息量大,而且比查询值得的更多。
毫无疑问,我在提出问题时需要更加努力,变得更加明确。通过-3的评分,我看到了这个笨拙的举动,明确表明我没有在知识库中添加任何内容,因此将删除该问题,以防止将来的搜索者找到该问题。我最近的问题一直表现不佳,作为本年度的前任老师,五本著作的作者和博士学位统计学家,我在Stack Exchange呆了这么长时间真是太尴尬了,一个声誉点。一。这意味着我对您答案的支持不算什么。
该声誉点应为深红色。
这就是我要得到的: 在书中,表达数据的常用方法是在2×2表格中:
Height
Gender 3 35
M 173 175
F 323 198
我的tic-tac大小的头脑看到将数据输入数据表的两种方法:
require(data.table)
GENDER <- c("m","m","f","f")
HEIGHT <- c(3, 35, 3, 35)
N <- c(173, 125, 323, 198)
SANDFLIERS <-data.table(GENDER, HEIGHT, N)
这给出了数据的四行平面文件/整洁表示形式:
GENDER HEIGHT N
1: m 3 173
2: m 35 125
3: f 3 323
4: f 35 198
另一种选择是制作一个173行数据表,其中的173公头@ 3英尺,125公头@ 35英尺等。如果使用rep()
命令并仔细构建表列,这还不错。我讨厌做算术运算,因此我不愿透露任何这些数字。
# I need 173+125 males, and 323+198 females.
# One c(rep()) for "m", one c(rep() for "f", and one c() to merge them
gender <- c(c(rep("m", 173+25)), c(rep("f",(323+198))))
# Same here, except the c() functions are one level 'deeper'. I need two
# sets for males (at heights 3 and 35, 173 and 125 of each, respectively)
# and two sets for females (at heights 3 and 35, 323 and 198 respectively)
heights <-c(c(c(rep(3, 173)), c(rep(35,25))), c(c(rep(3, 323)), c(rep(35,198))))
当合并为data.table
时会产生719行,每只观察到的鸟都有一行。
1: m 3
2: m 3
3: m 3
4: m 3
5: m 3
---
715: f 35
716: f 35
717: f 35
718: f 35
719: f 35
现在我拥有两种格式的数据,我开始寻找进行绘图和分析的方法。
我可以使用719行的版本来获得镶嵌图,但是由于我的1点声誉,您看不到它
mosaicplot(table(sandfliers), COLOR=TRUE, margin, legend=TRUE)
您可以使用4行版本的气球图
所以我的问题是,对于那些对这类事情有很多经验的人来说,您发现4行或719行表更常见吗?我可以从一个更改为另一个,但这是要添加到书中的更多代码(再次听到我的编辑说“您在教统计,而不是R”)。
因此,正如我在顶部说的那样,这只是一次非正式调查,以调查一种使用方式是否比另一种使用频率高,或者初学者使用它会更好。
答案 2 :(得分:0)
这是列联表的形式。直接输入R并不容易,但是可以按照以下步骤(基于http://cyclismo.org/tutorial/R/tables.html)进行操作:
> f <- matrix(c(173,125,323,198),nrow=2,byrow=TRUE)
> colnames(f) <- c(3,35)
> rownames(f) <- c("m","f")
> f <- as.table(f)
> f
3 35
m 173 125
f 323 198
然后您可以使用以下方法创建计数或频率表:
> as.data.frame(f)
Var1 Var2 Freq
1 m 3 173
2 f 3 323
3 m 35 125
4 f 35 198
R Cookbook提供了一个简短的功能,可以转换为案例表(即,单个项目的一长串列表),如下所示:
> countsToCases(as.data.frame(f))
...其中:
# Convert from data frame of counts to data frame of cases.
# `countcol` is the name of the column containing the counts
countsToCases <- function(x, countcol = "Freq") {
# Get the row indices to pull from x
idx <- rep.int(seq_len(nrow(x)), x[[countcol]])
# Drop count column
x[[countcol]] <- NULL
# Get the rows from x
x[idx, ]
}
...因此,您可以将数据转换为任何起始格式的任何分析方法所需的格式。
(编辑)
在列联表中读取的另一种方法是从这样的文本开始:
> ss <- " 3 35
+ m 173 125
+ f 323 198"
> read.table(text=ss,row.name=1)
X3 X35
m 173 125
f 323 198
除了使用text =
之外,您还可以使用文件名从CSV文件中读取表。