首页 > 解决方案 > Pivot_wider 和 Group 同时?

问题描述

我有一个看起来像这样的大数据框:

   Location       Dttm          Parameter      Unit         Value
1  Airport 2018-01-01 12:00:00 Wind Direction  deg          60
2  Airport 2018-01-01 12:00:00 Wind Speed      m/sec        3.45

显然还有更多的行,我只是展示数据的一个例子。我需要旋转数据,以便有一个风向和风速列。但是当我运行 pivot_wider 函数时,我会得到这样的结果:

   Location      Dttm          Unit     Wind Direction   Wind Speed   
1  Airport 2018-01-01 12:00:00 deg          60                NULL
2  Airport 2018-01-01 12:00:00 m/sec        NULL              3.45

我尝试了各种 group_by 方法,但没有找到任何可以让我得到我真正需要的东西,那就是:

   Location      Dttm              Wind Direction   Wind Speed   
1  Airport 2018-01-01 12:00:00          60             3.45

我认为如果我将 id_cols 设置为 Dttm,pivot_wider 会为我执行此操作,但这也不起作用。甚至不知道如何真正用谷歌搜索这个解决方案,所以任何帮助表示赞赏!

标签: r

解决方案


我们可以Unit在执行之前删除该列pivot_wider

library(dplyr)
library(tidyr)
df1 %>%
   select(-Unit) %>%
   pivot_wider(names_from = Parameter, values_from = Value)
# A tibble: 1 x 4
#   Location Dttm                `Wind Direction` `Wind Speed`
#   <chr>    <dttm>                         <dbl>        <dbl>
#1 Airport  2018-01-01 12:00:00               60         3.45

O 指定id_cols参数pivot_wider(如@IceCreamToucan 所示)

df1 %>% 
   pivot_wider(id_cols = -Unit, names_from = Parameter, values_from = Value) 

如果该组有重复的行,请在该组之前为该组创建一个序列列pivot_wider

df1 %>% 
   group_by(Parameter) %>% 
   mutate(rn = row_number()) %>% 
   pivot_wider(id_cols = -Unit, names_from = Parameter, values_from = Value) %>% 
   select(-rn)

数据

df1 <- structure(list(Location = c("Airport", "Airport"), Dttm = structure(c(1514826000, 
1514826000), class = c("POSIXct", "POSIXt"), tzone = ""), Parameter = c("Wind Direction", 
"Wind Speed"), Unit = c("deg", "m/sec"), Value = c(60, 3.45)), row.names = c("1", 
"2"), class = "data.frame")

推荐阅读