r - 如何根据每行中的值对数据进行透视
问题描述
假设我们有一个这样的数据框:
> dput(data)
structure(list(Location = structure(1:18, .Label = c("a", "b",
"c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r"), class = "factor"), C1 = c(7L, NA, 3L, 7L, NA,
NA, 2L, 7L, NA, NA, NA, NA, 2L, NA, NA, NA, NA, NA), C2 = c(NA,
8L, 1L, 1L, NA, 9L, 1L, 1L, NA, 1L, NA, 4L, 1L, NA, NA, NA, NA,
1L), C3 = c(3L, 1L, 7L, NA, NA, NA, 7L, 2L, 5L, 4L, 9L, 10L,
3L, 2L, 1L, 7L, NA, NA), C4 = c(NA, 2L, NA, 2L, 2L, 1L, 1L, 8L,
8L, 5L, 6L, 15L, 15L, 5L, 5L, 2L, 15L, NA), C5 = c(NA, NA, NA,
NA, 8L, NA, 2L, NA, 4L, 10L, 3L, 3L, 1L, NA, NA, 3L, NA, 8L)), class = "data.frame", row.names = c(NA,
-18L))
记录数据的方式,我们有一个Location
列,它代表一个已知的分组变量 levels a:r
。然后我们有列C1:C5
,它们本身代表 5 个集群,每个集群的样本Location
根据某个任意变量进行分类。因此,每列的总和说明了每列有多少样本Location
。例如,Location == a
有 10 个样本,其中 7 个被分类为C1
,3 个被分类为C3
。
我想创建一个列联表来执行卡方独立性检验,以查看Location
集群分配是否独立。当数据以这种格式记录时,我们如何重塑数据来做到这一点?
更新:除非有一种更简单的方法可以根据每行中的值(可以直接对其执行卡方检验)从当前格式获取列联表,否则我希望我们必须将其转换为 tidy格式,其中每个原始样本有两列Location
和Cluster
一个观察值,因此输出如下所示:
#there would be 10 observations for location a, 11 observations for b, and so on
Location Cluster
a C1
a C1
a C1
a C1
a C1
a C1
a C1
a C3
a C3
a C3
b C2
b C2
b C2
b C2
b C2
b C2
b C2
b C2
b C3
b C4
b C4
....
由此我们可以制作一个列联表并执行卡方检验
解决方案
我们可以重塑为“长”格式并用于uncount
复制行
library(dplyr)
library(tidyr)
data %>%
pivot_longer(cols = -Location, names_to = 'Cluster', values_drop_na = TRUE) %>%
uncount(value)
# A tibble: 251 x 2
# Location Cluster
# <fct> <chr>
# 1 a C1
# 2 a C1
# 3 a C1
# 4 a C1
# 5 a C1
# 6 a C1
# 7 a C1
# 8 a C3
# 9 a C3
#10 a C3
# … with 241 more rows
推荐阅读
- python - 根据列值从 DataFrame 中选择行,限制为 16384 行
- java - PayPal API 设置返回 URL
- apify - 尝试使用 apify web-scraper actor 抓取页面标题时出现错误 403
- gitlab-ci - 使用插件 frontend-maven-plugin 缓存节点模块库
- sql - 如何查询 2 个表,但其中一行可能为空?
- java - 一旦在物理设备中运行,它就会迅速关闭
- php - 如何在 php8.0 中编译 php 模块,该模块曾经在 php7 中使用 TSRMLS_CC,但在 php8.0 中已弃用
- python - 将 Python 输出存储到 csv 文件?
- python - 在 Pytorch 中使用 torch.Tensor 构造函数创建张量时使用什么分布?
- ansible - 如何在 Ansible 中的远程节点上执行 python 程序