使用带有多个变量的收集/传播使用 dplyr 重塑 df
Reshaping df with dplyr using gather / spread with multiple variables
我正在尝试使用 dplyr gather 和 spread 函数重塑我的数据集以从该数据形状移动:
library(tidyverse)
# test data set
df = tibble(factor = c("a","a","b","b"),
factor2 = c("d1","d2","d1","d2"),
value1 = round(rnorm(4),1)*10,
value2 = round(runif(4),2)*100)
看起来像这样:
# A tibble: 4 x 4
factor factor2 value1 value2
<chr> <chr> <dbl> <dbl>
1 a d1 4 97
2 a d2 -21 10
4 b d1 -2 65
5 b d2 -14 93
看起来像这样的东西:
factor d1val1 d1val2 d2val1 d2val2
a 4 97 -21 10
b -2 65 -14 93
理想情况下,我想通过 dplyr spread / gather 来实现这一点。
一个选项是 gather
'value' 列为 'long' 格式,然后 unite
'factor2' 和 'key' 列为创建一个列,然后 spread
恢复为 'wide' 格式
library(dplyr)
library(tidyr)
df %>%
gather(key, val, value1:value2) %>%
unite(dcols, factor2, key, sep = "") %>%
spread(dcols, val)
由于列类型相同,所以用gather
和spread
也是可以的
另一种tidyverse
可能是:
df %>%
gather(var, val, -c(factor, factor2)) %>%
mutate(var = paste0(factor2, var)) %>%
select(-factor2) %>%
spread(var, val)
factor d1value1 d1value2 d2value1 d2value2
<chr> <dbl> <dbl> <dbl> <dbl>
1 a -4 85 -4 65
2 b 4 39 -1 20
它首先将数据从宽格式转换为长格式,不包括变量 "factor" 和 "factor2"。其次,它将 "factor2" 中的值和变量名称组合在一起。最后,它删除冗余变量和 returns 数据到所需的格式。
为了完整起见,dcast()
的 data.table 实现能够同时重塑多个变量:
library(data.table)
dcast(setDT(df), factor ~ factor2, value.var = c("value1", "value2"))
factor value1_d1 value1_d2 value2_d1 value2_d2
1: a 4 -21 97 10
2: b -2 -14 65 93
我正在尝试使用 dplyr gather 和 spread 函数重塑我的数据集以从该数据形状移动:
library(tidyverse)
# test data set
df = tibble(factor = c("a","a","b","b"),
factor2 = c("d1","d2","d1","d2"),
value1 = round(rnorm(4),1)*10,
value2 = round(runif(4),2)*100)
看起来像这样:
# A tibble: 4 x 4
factor factor2 value1 value2
<chr> <chr> <dbl> <dbl>
1 a d1 4 97
2 a d2 -21 10
4 b d1 -2 65
5 b d2 -14 93
看起来像这样的东西:
factor d1val1 d1val2 d2val1 d2val2
a 4 97 -21 10
b -2 65 -14 93
理想情况下,我想通过 dplyr spread / gather 来实现这一点。
一个选项是 gather
'value' 列为 'long' 格式,然后 unite
'factor2' 和 'key' 列为创建一个列,然后 spread
恢复为 'wide' 格式
library(dplyr)
library(tidyr)
df %>%
gather(key, val, value1:value2) %>%
unite(dcols, factor2, key, sep = "") %>%
spread(dcols, val)
由于列类型相同,所以用gather
和spread
另一种tidyverse
可能是:
df %>%
gather(var, val, -c(factor, factor2)) %>%
mutate(var = paste0(factor2, var)) %>%
select(-factor2) %>%
spread(var, val)
factor d1value1 d1value2 d2value1 d2value2
<chr> <dbl> <dbl> <dbl> <dbl>
1 a -4 85 -4 65
2 b 4 39 -1 20
它首先将数据从宽格式转换为长格式,不包括变量 "factor" 和 "factor2"。其次,它将 "factor2" 中的值和变量名称组合在一起。最后,它删除冗余变量和 returns 数据到所需的格式。
为了完整起见,dcast()
的 data.table 实现能够同时重塑多个变量:
library(data.table)
dcast(setDT(df), factor ~ factor2, value.var = c("value1", "value2"))
factor value1_d1 value1_d2 value2_d1 value2_d2 1: a 4 -21 97 10 2: b -2 -14 65 93