在 R 中通过多个观察从长到宽的转换
Transformation from long to wide with multiple observations in R
我想将数据集从长数据集转换为宽数据集。
数据包含每个时间点的多个观察值。
为了说明,请考虑以下两个示例。
在下面的示例 1 中,数据不包含多个观测值并且可以从长转换为宽。
在下面的示例 2 中,数据 确实包含多个观察值 (每个时间点 n=3)并且无法从长转换为宽,用 dcast
进行测试和 pivot_wider
.
谁能建议一种将示例 2 中的测试数据转换为有效格式的方法?
重现问题的代码:
library(ggplot2)
library(ggcorrplot)
library(reshape2)
library(tidyr)
library(data.table)
# EXAMPLE 1 (does work)
# Test data
set.seed(5)
time <- rep(c(0,10), 1, each = 2)
feature <- rep(c("feat1", "feat2"), 2)
values <- runif(4, min=0, max=1)
# Concatenate test data
# test has non-unique values in time column
test <- data.table(time, feature, values)
# Transform data into wide format
test_wide <- dcast(test, time ~ feature, value.var = 'values')
# EXAMPLE 2 (does not work)
# Test data
set.seed(5)
time <- rep(c(0,10), 2, each = 6)
feature <- c(rep("feat1", 12), rep("feat2", 12))
values <- runif(24, min=0, max=1)
# Concatenate test data
# test has non-unique values in time column
test <- data.table(time, feature, values)
# Transform data into wide format
test_wide <- dcast(test, time ~ feature, value.var = 'values')
警告:
Aggregate function missing, defaulting to 'length'
问题:
第一列 (time
) 中的非唯一值不是 preserved/allowed。
# Testing with pivot_wider
test_wider <- pivot_wider(test, names_from = feature, values_from = values)
警告:
Warning message:
Values are not uniquely identified; output will contain list-cols.
问题:
第一列 (time
) 中的非唯一值不是 preserved/allowed。
由于没有更好的主意,可能 输出可能如下所示:
time
feat1
feat2
0
0.1046501
0.5279600
0
0.7010575
0.8079352
0
0.2002145
0.9565001
等等
由于存在多个值,因此在转换为宽格式时应如何处理这些值并不明显。这就是您收到警告消息的原因。这是处理它们的一种方法。如果您想要其他东西,请给出一个 具体 示例,说明 输出应该是什么样子 。
pivot_wider(test, names_from = feature, values_from = values) %>%
unnest(c(feat1, feat2))
你可能想要这样的东西:
library(dplyr)
test %>%
pivot_wider(names_from = c(feature, time),
values_from = values)
其中 c(feature, times) 说明了多变量情况。但正如评论中已经指出的那样,请指出您是否想要其他东西。
我想将数据集从长数据集转换为宽数据集。 数据包含每个时间点的多个观察值。
为了说明,请考虑以下两个示例。
在下面的示例 1 中,数据不包含多个观测值并且可以从长转换为宽。
在下面的示例 2 中,数据 确实包含多个观察值 (每个时间点 n=3)并且无法从长转换为宽,用 dcast
进行测试和 pivot_wider
.
谁能建议一种将示例 2 中的测试数据转换为有效格式的方法?
重现问题的代码:
library(ggplot2)
library(ggcorrplot)
library(reshape2)
library(tidyr)
library(data.table)
# EXAMPLE 1 (does work)
# Test data
set.seed(5)
time <- rep(c(0,10), 1, each = 2)
feature <- rep(c("feat1", "feat2"), 2)
values <- runif(4, min=0, max=1)
# Concatenate test data
# test has non-unique values in time column
test <- data.table(time, feature, values)
# Transform data into wide format
test_wide <- dcast(test, time ~ feature, value.var = 'values')
# EXAMPLE 2 (does not work)
# Test data
set.seed(5)
time <- rep(c(0,10), 2, each = 6)
feature <- c(rep("feat1", 12), rep("feat2", 12))
values <- runif(24, min=0, max=1)
# Concatenate test data
# test has non-unique values in time column
test <- data.table(time, feature, values)
# Transform data into wide format
test_wide <- dcast(test, time ~ feature, value.var = 'values')
警告:
Aggregate function missing, defaulting to 'length'
问题:
第一列 (time
) 中的非唯一值不是 preserved/allowed。
# Testing with pivot_wider
test_wider <- pivot_wider(test, names_from = feature, values_from = values)
警告:
Warning message:
Values are not uniquely identified; output will contain list-cols.
问题:
第一列 (time
) 中的非唯一值不是 preserved/allowed。
由于没有更好的主意,可能 输出可能如下所示:
time | feat1 | feat2 |
---|---|---|
0 | 0.1046501 | 0.5279600 |
0 | 0.7010575 | 0.8079352 |
0 | 0.2002145 | 0.9565001 |
等等
由于存在多个值,因此在转换为宽格式时应如何处理这些值并不明显。这就是您收到警告消息的原因。这是处理它们的一种方法。如果您想要其他东西,请给出一个 具体 示例,说明 输出应该是什么样子 。
pivot_wider(test, names_from = feature, values_from = values) %>%
unnest(c(feat1, feat2))
你可能想要这样的东西:
library(dplyr)
test %>%
pivot_wider(names_from = c(feature, time),
values_from = values)
其中 c(feature, times) 说明了多变量情况。但正如评论中已经指出的那样,请指出您是否想要其他东西。