Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tidyr:跨多个数据帧传播数据_R_Tidyr - Fatal编程技术网

Tidyr:跨多个数据帧传播数据

Tidyr:跨多个数据帧传播数据,r,tidyr,R,Tidyr,我在R中有以下数据帧: Date | ID | Shape | Size | Color ---- | -- | ----- | ---- | ---- 1/1/1| 01 | RND | L | RED 1/1/1| 02 | RND | M | BRN 1/1/1| 03 | SQR | S | BLK 1/2/1| 01 | TRI | S | GRN 1/2/1| 02 | SQR | L | BLK 1/2/1| 03 | RND

我在
R
中有以下数据帧:

Date | ID | Shape | Size | Color
---- | -- | ----- | ---- | ----
1/1/1| 01 | RND   | L    | RED
1/1/1| 02 | RND   | M    | BRN
1/1/1| 03 | SQR   | S    | BLK 
1/2/1| 01 | TRI   | S    | GRN
1/2/1| 02 | SQR   | L    | BLK
1/2/1| 03 | RND   | L    | BLU 
1/3/1| 01 | OVL   | M    | YEL
1/3/1| 02 | STR   | L    | ORA
1/3/1| 03 | CUB   | S    | PUR
...  | .. | ...   | ...  | ...
我想将此数据帧转换为以下单独的数据帧:

df_shape:

Date | Shape.id1 | Shape.id2 | Shape.id3
---- | --------- | --------- | ---------
1/1/1| RND       | RND       | SQR
1/2/1| TRI       | SQR       | RND
1/3/1| OVL       | STR       | CUB
...  | ...       | ...       | ...


df_size:

Date | Size.id1  | Size.id2  | Size.id3
---- | --------- | --------- | ---------
1/1/1| L         | M         | S
1/2/1| S         | L         | L
1/3/1| M         | L         | S
...  | ...       | ...       | ...


df_color:

Date | Color.id1 | Color.id2| Color.id3
---- | --------- | ---------| ---------
1/1/1| RED       | BRN      | BLK
1/2/1| GRN       | BLK      | BLU
1/3/1| YEL       | ORA      | PUR
...  | ...       | ...      | ...
我知道在这种情况下,
tidyr
spread()
可能是完美的,但我不确定如何真正做到这一点

  • 使用日期的
    键、值组合是什么
  • 然后,如何将子集划分为多个数据帧
谢谢

好吧,你可以这样做:

df_shape <- df %>% distinct(Date, ID, Shape) %>%
  mutate(ID = paste0("Shape.id", ID)) %>%
  spread(ID, Shape)

df_size <- df %>% distinct(Date, ID, Size) %>%
  mutate(ID = paste0("Size.id", ID)) %>%
  spread(ID, Size)

df_color <- df %>% distinct(Date, ID, Color) %>%
  mutate(ID = paste0("Color.id", ID)) %>%
  spread(ID, Color)
df_形状%distinct(日期、ID、形状)%%>%
变异(ID=paste0(“Shape.ID”,ID))%>%
排列(ID、形状)
df_大小%不同(日期、ID、大小)%>%
变异(ID=0(“Size.ID”,ID))%>%
排列(ID、大小)
df_颜色%不同(日期、ID、颜色)%>%
变异(ID=paste0(“Color.ID”,ID))%>%
排列(ID、颜色)

我将使用R附带的
iris
数据集创建一个示例,并使用“tidyverse”中的包。首先,我将创建一个
date
变量,使
iris
看起来更像您的数据集

library(purrr)
library(dplyr)
library(tidyr)
d <- mutate(iris, date = rep(1:50, 3))
现在我们使用
map
来迭代
变量

out <- map(variables, function(f) {
  select(d, date, Species, f) %>%
    spread(key = Species, value = f) %>%
    rename_at(2:4, ~paste0(f, "_", .))
})
您可以将
保留为数据帧列表,也可以使用

list2env(out, envir = globalenv())

将列表组件分配到全局环境中。

您可以给我们一个玩具示例或数据样本(使用
dput()
或其他允许创建数据帧的代码)您可以使用
dplyr::select()
选择日期和形状变量,然后
tidyr::spread()
。其他变量也是如此
str(out)
# List of 4
#  $ df_Sepal.Length:'data.frame':        50 obs. of  4 variables:
#   ..$ date                   : int [1:50] 1 2 3 4 5 6 7 8 9 10 ...
#   ..$ Sepal.Length_setosa    : num [1:50] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#   ..$ Sepal.Length_versicolor: num [1:50] 7 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 ...
#   ..$ Sepal.Length_virginica : num [1:50] 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 ...
#  $ df_Sepal.Width :'data.frame':        50 obs. of  4 variables:
#   ..$ date                  : int [1:50] 1 2 3 4 5 6 7 8 9 10 ...
#   ..$ Sepal.Width_setosa    : num [1:50] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#   ..$ Sepal.Width_versicolor: num [1:50] 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 ...
#   ..$ Sepal.Width_virginica : num [1:50] 3.3 2.7 3 2.9 3 3 2.5 2.9 2.5 3.6 ...
#  $ df_Petal.Length:'data.frame':        50 obs. of  4 variables:
#   ..$ date                   : int [1:50] 1 2 3 4 5 6 7 8 9 10 ...
#   ..$ Petal.Length_setosa    : num [1:50] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#   ..$ Petal.Length_versicolor: num [1:50] 4.7 4.5 4.9 4 4.6 4.5 4.7 3.3 4.6 3.9 ...
#   ..$ Petal.Length_virginica : num [1:50] 6 5.1 5.9 5.6 5.8 6.6 4.5 6.3 5.8 6.1 ...
#  $ df_Petal.Width :'data.frame':        50 obs. of  4 variables:
#   ..$ date                  : int [1:50] 1 2 3 4 5 6 7 8 9 10 ...
#   ..$ Petal.Width_setosa    : num [1:50] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#   ..$ Petal.Width_versicolor: num [1:50] 1.4 1.5 1.5 1.3 1.5 1.3 1.6 1 1.3 1.4 ...
#   ..$ Petal.Width_virginica : num [1:50] 2.5 1.9 2.1 1.8 2.2 2.1 1.7 1.8 1.8 2.5 ...
list2env(out, envir = globalenv())