在R中融化数据帧



我有活动用户的数据帧,当用户在这个特定日期处于活动状态时,数据帧为1,而当他不在活动状态时为0
我正试图从此修改我的数据帧:

df <- data.frame(userID=c("user123","user124","user125"),
`2021-03-01`=c(1,0,1),
`2021-03-08`=c(1,1,1),
`2021-03-15`=c(0,0,1))

以一种优雅的方式:

df <- data.frame(userID=c("user123", "user125", "user123","user124","user125","user125"),
Active_WeekDate=c("2021-03-01","2021-03-01", "2021-03-08", "2021-03-08","2021-03-08","2021-03-15"))

我找到了这个解决方案,但还有更优雅的方法吗?

library(tidyr)
df <- pivot_longer(df, cols = -userID, names_to="Active_WeekDate")
df <- df[ df$value==1, ]
df <- df[ , c(1,2)]
df

非常感谢您的帮助!

我总是发现dplyr方法更优雅:

library(tidyverse)
df %>%
pivot_longer(cols = -userID, names_to="Active_WeekDate") %>%
filter(value == 1) %>%
select(1:2) %>%
mutate(Active_WeekDate = gsub("X", "", Active_WeekDate))

输出:

userID  Active_WeekDate
<chr>   <chr>          
1 user123 2021.03.01     
2 user123 2021.03.08     
3 user124 2021.03.08     
4 user125 2021.03.01     
5 user125 2021.03.08     
6 user125 2021.03.15 

这个怎么样?

df <- data.frame(userID=c("user123","user124","user125"),
`2021-03-01`=c(1,0,1),
`2021-03-08`=c(1,1,1),
`2021-03-15`=c(0,0,1))
library(tidyverse)
df %>% pivot_longer(starts_with('X'), names_to = 'Active_week_date',names_prefix = 'X', values_transform = list(value = as.logical)) %>%
filter(value) %>% select(-value)
#> # A tibble: 6 x 2
#>   userID  Active_week_date
#>   <chr>   <chr>           
#> 1 user123 2021.03.01      
#> 2 user123 2021.03.08      
#> 3 user124 2021.03.08      
#> 4 user125 2021.03.01      
#> 5 user125 2021.03.08      
#> 6 user125 2021.03.15

创建于2021-06-04由reprex包(v2.0.0(