R 数据框根据日期将列名转换为行,列名具有公共字符串并且非 0 值到 1 行项

R data frame convert column names to rows based on dates, the column names which has a common string and there non 0 values to 1 row item

我想通过查看条件将 R 数据框列名称转换为行,

  1. 如果两个列名的部分公用名由“_”分隔,如 x_a01,y_a01 将其转换为 1 基于日期的通用名称为 a01 的行项目。 例如:x_a01、y_a01 -> a01、x_b01、y_b01 -> b01
  2. 这些转换为行值的列名应该有非零值。 例如:x_c01、y_c01 在第一行中有 0 个值,在转换为行项目时应忽略这些值

数据框:

将上述数据帧转换为:

我们可以使用 pivot_longer 将数据重塑为 'long' 格式,然后使用 filter 删除任何 x 和 y 值都为 0

的行
library(dplyr)
library(dplyr)
df1 %>%
    pivot_longer(cols = -date, names_to = c(".value", "colname"), 
        names_sep = "_", values_drop_na = TRUE)%>% 
    filter(if_any(c(x, y), ~ . > 0))

-输出

# A tibble: 5 x 4
#  date       colname     x     y
#  <chr>      <chr>   <dbl> <dbl>
#1 01-01-2021 a01       1     2  
#2 01-01-2021 b01       0     4  
#3 01-01-2021 d01       3     4  
#4 02-01-2021 b01       3.1   1.1
#5 02-01-2021 c01       4.5   6.2

数据

df1 <- structure(list(date = c("01-01-2021", "02-01-2021"), x_a01 = c(1, 
0), y_a01 = c(2, 0), x_b01 = c(0, 3.1), y_b01 = c(4, 1.1), x_c01 = c(0, 
4.5), y_c01 = c(0, 6.2), x_d01 = c(3, 0), y_d01 = c(4, 0)),
class = "data.frame", row.names = c(NA, 
-2L))