R语言 透视表ID从一列到多列,并将它们与另一列字符配对

0md85ypi  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(101)

我的问题如下。我有这样的数据框:

ID <- c(1,2,NA,3,NA,4,NA,NA,5,NA,NA,NA)

Col_1 <- c(NA,45,NA,23,1,2,8,NA,78,12,NA,19)

Objekt.Nr. <- c(1,1,2,1,2,1,2,3,1,2,3,4)

Fahrzeugart <- c("E-Bike", "Fahrrad", "Fahrrad", "Fahrrad", "Bus", "Bus", "Fahrrad", "Auto", "E-Bike", "Fahrrad", "Fahrrad", "Fahrrad")

Col_2 <- c(1,2,3,4,NA,5,6,7,NA,89,10,12)

df <- data.frame(ID,Col_1, Objekt.Nr., Fahrzeugart, Col_2)

我需要转换它,使每个ID只有一行,而不是像现在这样有几行。为此,我需要透视数据框,使每个对象Objekt.Nr都与Fahrzeugart的新列相对应。
我的目标是数据框看起来像这样:

ID <- c(1,2,3,4,5)

Fahrzeug_1 <- c("E-Bike","Fahrrad","Fahrrad","Bus","E-Bike")

Fahrzeug_2 <- c(NA, "Fahrrad", "Bus", "Fahrrad", "Fahrrad")

Fahrzeug_3 <- c(NA,NA,NA, "Auto", "Fahrrad")

Fahrzeug_4 <- c(NA,NA,NA,NA, "Fahrrad")

col_1 <- c(1,(2,3)...) #merged for every ID

same for Col_2

df_wanted <- data.frame(ID,Fahrzeug_1,Fahrzeug_2,Fahrzeug_3,Fahrzeug_4)

我尝试使用这段代码,但它只会返回“Fahrzeugart”的二进制值:

df_melted <- melt(df, id.vars = c("ID"), measure.vars = c("Fahrzeugart")) 

df_wanted <- dcast(df_melted, ID ~ Objekt.Nr., value.var = "Fahrzeugart")

非常感谢!

eanckbw9

eanckbw91#

您可以使用tidyr包中的fill()来填充缺少的ID值,然后使用tidyr包中的pivot_wider()将长格式更改为宽格式。

library(dplyr)
library(tidyr)
ID <- c(1,2,NA,3,NA,4,NA,NA,5,NA,NA,NA)
Objekt.Nr. <- c(1,1,2,1,2,1,2,3,1,2,3,4)
Fahrzeugart <- c("E-Bike", "Fahrrad", "Fahrrad", "Fahrrad", "Bus", "Bus", "Fahrrad", "Auto", "E-Bike", "Fahrrad", "Fahrrad", "Fahrrad")
df <- data.frame(ID, Objekt.Nr., Fahrzeugart)

df %>% 
  fill(ID, .direction="down") %>% 
  pivot_wider(names_from="Objekt.Nr.", values_from = "Fahrzeugart", names_prefix="Fahrzeugart_")
#> # A tibble: 5 × 5
#>      ID Fahrzeugart_1 Fahrzeugart_2 Fahrzeugart_3 Fahrzeugart_4
#>   <dbl> <chr>         <chr>         <chr>         <chr>        
#> 1     1 E-Bike        <NA>          <NA>          <NA>         
#> 2     2 Fahrrad       Fahrrad       <NA>          <NA>         
#> 3     3 Fahrrad       Bus           <NA>          <NA>         
#> 4     4 Bus           Fahrrad       Auto          <NA>         
#> 5     5 E-Bike        Fahrrad       Fahrrad       Fahrrad

reprex package(v2.0.1)于2023年2月14日创建

编辑:如果有其他列怎么办

如果您可以在数据中包含一些列表列,可以执行以下操作:

library(dplyr)
library(tidyr)
ID <- c(1,2,NA,3,NA,4,NA,NA,5,NA,NA,NA)
Col_1 <- c(NA,45,NA,23,1,2,8,NA,78,12,NA,19)
Objekt.Nr. <- c(1,1,2,1,2,1,2,3,1,2,3,4)
Fahrzeugart <- c("E-Bike", "Fahrrad", "Fahrrad", "Fahrrad", "Bus", "Bus", "Fahrrad", "Auto", "E-Bike", "Fahrrad", "Fahrrad", "Fahrrad")
Col_2 <- c(1,2,3,4,NA,5,6,7,NA,89,10,12)
df <- data.frame(ID,Col_1, Objekt.Nr., Fahrzeugart, Col_2)

df %>% 
  fill(ID, .direction="down") %>% 
  pivot_wider(id_cols=ID, 
              names_from="Objekt.Nr.", 
              values_from = "Fahrzeugart", 
              names_prefix="Fahrzeugart_", 
              unused_fn = list)
#> # A tibble: 5 × 7
#>      ID Fahrzeugart_1 Fahrzeugart_2 Fahrzeugart_3 Fahrzeugart_4 Col_1     Col_2 
#>   <dbl> <chr>         <chr>         <chr>         <chr>         <list>    <list>
#> 1     1 E-Bike        <NA>          <NA>          <NA>          <dbl [1]> <dbl> 
#> 2     2 Fahrrad       Fahrrad       <NA>          <NA>          <dbl [2]> <dbl> 
#> 3     3 Fahrrad       Bus           <NA>          <NA>          <dbl [2]> <dbl> 
#> 4     4 Bus           Fahrrad       Auto          <NA>          <dbl [3]> <dbl> 
#> 5     5 E-Bike        Fahrrad       Fahrrad       Fahrrad       <dbl [4]> <dbl>

reprex package(v2.0.1)于2023年2月14日创建

相关问题