r - 有没有更好的方法将具有多列的“长”表传播到“宽”表中?
问题描述
我想将一个长数据框重塑为一个宽数据框。也就是说,我想从这个开始:
file label val1 val2
1 red A 12 3
2 red B 4 2
3 red C 5 8
4 green A 3 3
5 green B 6 5
6 green C 9 6
7 blue A 3 3
8 blue B 1 2
9 blue C 4 6
对此:
file value1_A value1_B value1_C value2_A value2_B value2_C
1 red 12 4 5 3 2 8
2 green 3 6 9 3 5 6
3 blue 3 1 4 3 2 6
到目前为止,我的最佳尝试如下:
library(tidyverse)
dat <-
structure(list(file = structure(c(3L, 3L, 3L, 2L, 2L, 2L, 1L, 1L, 1L),
.Label = c("blue", "green", "red"),
class = "factor"),
label = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L),
.Label = c("A", "B", "C"),
class = "factor"),
val1 = c(12L, 4L, 5L, 3L, 6L, 9L, 3L, 1L, 4L),
val2 = c(3L, 2L, 8L, 3L, 5L, 6L, 3L, 2L, 6L)),
class = "data.frame", row.names = c(NA, -9L))
dat %>%
group_by(file) %>%
mutate(values1 = paste('value1', label, sep='_'),
values2 = paste('value2', label, sep='_')) %>%
spread(values1, val1) %>%
spread(values2, val2) %>%
select(-label)
# # A tibble: 9 x 7
# # Groups: file [3]
# file value1_A value1_B value1_C value2_A value2_B value2_C
# <fct> <int> <int> <int> <int> <int> <int>
# 1 blue 3 NA NA 3 NA NA
# 2 blue NA 1 NA NA 2 NA
# 3 blue NA NA 4 NA NA 6
# 4 green 3 NA NA 3 NA NA
# 5 green NA 6 NA NA 5 NA
# 6 green NA NA 9 NA NA 6
# 7 red 12 NA NA 3 NA NA
# 8 red NA 4 NA NA 2 NA
# 9 red NA NA 5 NA NA 8
输出不能令人满意,因为应该在一行上的内容占了三个,并且有多个“NA”。这似乎是由于使用spread
了两次,但我不知道如何达到我想要的结果。我非常感谢有关如何执行此操作的任何建议。
非常感谢,-R
解决方案
这里有一个方法
library(tidyverse)
dat %>%
# first move to long form so we can
# see the original column names as strings
gather("variable_name", "value", contains("val")) %>%
# create the new column names from the variable name and the label
mutate(new_column_name = paste(variable_name, label, sep="_")) %>%
# get rid of the pieces we used to make the column names
select(-label, -variable_name) %>%
# now spread
spread(new_column_name, value)
推荐阅读
- python - Python Flask app.run 不可访问,IP 未显示在终端中
- php - 使用元刷新强制 PHP 会话销毁
- octree - 在八叉树中查找位置/象限
- sql-server - 有人可以帮我理解我的 SQL Server 查询中的这个 ORDER BY 错误吗?
- amazon-web-services - 如何获取 AWS RDS DbInstance 资源 ID?
- c - 如何添加第三个子进程?
- python - 如何使用 OpenCV 裁剪图像中的白色斑块并制作护照大小的照片
- network-programming - 在不改变 Netlogo 中网络特征的情况下,用新的代理扩展现有的 Preferential-Attachment-Network (Barabási/Albert)
- azure - Azure 上的 Kubeflow - 无法运行管道
- tensorrt - TensorRT 警告:由于驱动程序或 nvrtc 不兼容,卷积 + 通用激活融合被禁用