从分组值创建意外事件 table
Creating a contingency table from grouped values
我有一个数据框,"dat",有一个因子,"letters"(它有三个级别,"A","B",和"C" ),以及一个数值向量,"numbers"(值从 1 到 80):
dat <- data.frame(letters = sample(LETTERS[1:3], 15, replace = TRUE),
numbers = sample(80, 15, replace = TRUE))
我想创建一个应急事件table,其中 "B" 和 "C" 水平被分组,值被分组为高于 40.5 和低于 40.5 的值。
也就是说,由此产生的意外事件table应该是这样的(当然频率不同):
> table(...)
numbers
letters 1:40 41:80
A 2 3
B + C 4 6
我创建了 table,方法是首先在我的数据框中引入两个新列,然后从这些列创建 table:
dat$two.letters <- "A"
dat[dat$letters != "A", ]$two.letters <- "B + C"
dat$two.letters <- as.factor(dat$two.letters)
dat$two.numbers <- "1:40"
dat[dat$numbers > 40, ]$two.numbers <- "41:80"
dat$two.numbers <- as.factor(dat$two.numbers)
table(dat$two.letters, dat$two.numbers)
1:40 41:80
A 3 1
B + C 6 5
但我想在不引入新列 或构建单独的数据框的情况下创建 table 。相反,我想在 table()
命令中对值进行分组。
这可能吗?
我们可以使用非常有用的 ifelse
function to relabel your data points. We also use the with
函数来避免额外的输入:
with(dat,
table(ifelse(letters == 'A', 'A', 'B+C'), ifelse(numbers <= 40, '1:40','41:80')))
1:40 41:80
A 1 2
B+C 4 8
数据(注意set.seed
的用法)
set.seed(123)
dat <- data.frame(letters = sample(LETTERS[1:3], 15, replace = TRUE),
numbers = sample(80, 15, replace = TRUE))
我有一个数据框,"dat",有一个因子,"letters"(它有三个级别,"A","B",和"C" ),以及一个数值向量,"numbers"(值从 1 到 80):
dat <- data.frame(letters = sample(LETTERS[1:3], 15, replace = TRUE),
numbers = sample(80, 15, replace = TRUE))
我想创建一个应急事件table,其中 "B" 和 "C" 水平被分组,值被分组为高于 40.5 和低于 40.5 的值。
也就是说,由此产生的意外事件table应该是这样的(当然频率不同):
> table(...)
numbers
letters 1:40 41:80
A 2 3
B + C 4 6
我创建了 table,方法是首先在我的数据框中引入两个新列,然后从这些列创建 table:
dat$two.letters <- "A"
dat[dat$letters != "A", ]$two.letters <- "B + C"
dat$two.letters <- as.factor(dat$two.letters)
dat$two.numbers <- "1:40"
dat[dat$numbers > 40, ]$two.numbers <- "41:80"
dat$two.numbers <- as.factor(dat$two.numbers)
table(dat$two.letters, dat$two.numbers)
1:40 41:80
A 3 1
B + C 6 5
但我想在不引入新列 或构建单独的数据框的情况下创建 table 。相反,我想在 table()
命令中对值进行分组。
这可能吗?
我们可以使用非常有用的 ifelse
function to relabel your data points. We also use the with
函数来避免额外的输入:
with(dat,
table(ifelse(letters == 'A', 'A', 'B+C'), ifelse(numbers <= 40, '1:40','41:80')))
1:40 41:80
A 1 2
B+C 4 8
数据(注意set.seed
的用法)
set.seed(123)
dat <- data.frame(letters = sample(LETTERS[1:3], 15, replace = TRUE),
numbers = sample(80, 15, replace = TRUE))