我的问题如下。我有这样的数据框:
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")
非常感谢!
1条答案
按热度按时间eanckbw91#
您可以使用
tidyr
包中的fill()
来填充缺少的ID值,然后使用tidyr
包中的pivot_wider()
将长格式更改为宽格式。由reprex package(v2.0.1)于2023年2月14日创建
编辑:如果有其他列怎么办
如果您可以在数据中包含一些列表列,可以执行以下操作:
由reprex package(v2.0.1)于2023年2月14日创建