r - 将数据帧从一个第一个转换为另一个
问题描述
我有一个看起来像这样的数据框。
> head(zeisel)
gene_name ClusterName p
1 GNAI3 ABC 0.29914
2 GNAI3 ACBG 0.33417
3 GNAI3 ACMB 0.21984
4 GNAI3 ACNT1 0.14727
5 GNAI3 ACNT2 0.22205
6 GNAI3 ACOB 0.16913
我想把它转换成这个:
有没有办法做到这一点?我尝试先设置名称,但这意味着迭代地绑定每一行。
例如:
#get name of new df
cells <- as.data.frame(table(df$ClusterName))
#now create an empty dataframe.
unmelted_df <- setNames(data.frame(matrix(ncol = length(cells$Var1), nrow = 0)), as.character(cells$Var1))
对于海量数据框,有没有一种方法可以一步完成?
解决方案
一个选项是创建序列列,然后spread
变成“宽”格式
library(tidyverse)
zeisel %>%
mutate(rn = 1) %>%
spread(ClusterName, p)
# gene_name rn ABC ACBG ACMB ACNT1 ACNT2 ACOB
#1 GNAI3 1 0.29914 0.33417 0.21984 0.14727 0.22205 0.16913
从较新版本的tidyr
,spread
将被弃用并在适当的位置pivot_wider
可以使用
zeisel %>%
pivot_wider(names_from = 'ClusterName', values_from = 'p')
# A tibble: 1 x 7
# gene_name ABC ACBG ACMB ACNT1 ACNT2 ACOB
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 GNAI3 0.299 0.334 0.220 0.147 0.222 0.169
或使用dcast
fromdata.table
library(data.table)
dcast(setDT(zeisel), gene_name ~ ClusterName, value.var = 'p')
# gene_name ABC ACBG ACMB ACNT1 ACNT2 ACOB
#1: GNAI3 0.29914 0.33417 0.21984 0.14727 0.22205 0.16913
数据
zeisel <- structure(list(gene_name = c("GNAI3", "GNAI3", "GNAI3", "GNAI3",
"GNAI3", "GNAI3"), ClusterName = c("ABC", "ACBG", "ACMB", "ACNT1",
"ACNT2", "ACOB"), p = c(0.29914, 0.33417, 0.21984, 0.14727, 0.22205,
0.16913)), class = "data.frame", row.names = c(NA, -6L))
推荐阅读
- c# - 每个超过 3 个字母的单词都以大写开头 + 第一行是大写 - 快速提问
- c# - 绑定到作为另一个对象的属性的 DataTable:System.ArgumentException 列不属于该表
- java - 如何从 lambda 中获取变量?
- python - 过滤熊猫数据框以限制在给定的日期范围内
- javascript - 如何标签过去关闭的模态链接?#a11y
- ios - 获取 Wifi(SSID) 列表 ios 应用程序并连接到我的应用程序是可能的吗?
- linux - 未投递的邮件退回给发件人 - 不同的域目的地
- google-cloud-spanner - CloudSpanner 是否支持模糊搜索或通配符搜索?
- google-cloud-platform - 围绕创建 VPC 访问连接器的困惑
- select - Azure AD Graph 组成员 oData 结果限制