r:filter_at或filter_all满足两个条件的字符串,然后是pivot_longger

izj3ouym  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(68)

我有一个非常大的数据框,记录了多次随访时MRI扫描的肿瘤大小。
假设我有p

id debut_extramea_xy_dimension_MR fu1_extramea_xy_dimension_MR fu2_extramea_xy_dimension_MR fu3_extramea_xy_dimension_MR
1 134                          14x14                        14x14                    12.5x10.5                    12.5x10.5
2 434                   24 x 19 x 13                      24 x 17                      24 x 17                      21 x 16
3 437                        40 x 30                   20 x 20 mm                      20 x 20                      25 x 18
4 440                        26 x 24                      26 x 24                      26 x 24                      26 x 24
5 498                         13x6.4                     14.8x8.7                    19.4x12.3                    21.7x13.5

如图所示,数据记录了肿瘤的二维“xy”轴数据,但存在两个问题:

**(1)**登记数据的人员无意中记录了一些患者的三维,“xyz”轴。这在p$debut_extramea_xy_dimension_MR的第2行中得到证明,对应于p$id == 434

以及

**(2)**在某些情况下,测量单位被意外记录,例如p$fu1_extramea_xy_dimension_MR第3行中的“mm”,对应于p$id == 437

我需要filterpivot_longer,以便获得包含三列的 Dataframe :(1)id,(2)在什么后续行动和(3)什么错误。我需要进入数据库手动更改这一点,所以这些信息将是一个很大的帮助。

预期产出

id  name        value
1 434 debut 24 x 19 x 13
2 437   fu1   20 x 20 mm

数据

p <- structure(list(id = c(134L, 434L, 437L, 440L, 498L), debut_extramea_xy_dimension_MR = c("14x14", 
                                                                                    "24 x 19 x 13", "40 x 30", "26 x 24", "13x6.4"), fu1_extramea_xy_dimension_MR = c("14x14", 
                                                                                                                                                                  "24 x 17", "20 x 20 mm", "26 x 24", "14.8x8.7"), fu2_extramea_xy_dimension_MR = c("12.5x10.5", 
                                                                                                                                                                                                                                                 "24 x 17", "20 x 20", "26 x 24", "19.4x12.3"), fu3_extramea_xy_dimension_MR = c("12.5x10.5", 
                                                                                                                                                                                                                                                                                                                                 "21 x 16", "25 x 18", "26 x 24", "21.7x13.5")), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                                               -5L), class = "data.frame")
3htmauhk

3htmauhk1#

这里有一个解决方案

library(tidyverse)                                                                                                                                                                                                                                                                                                                                                                                               -5L), class = "data.frame")
p %>%
  filter(if_any(- id, ~ str_detect(., rgx <<- "x.*x|mm"))) %>% 
  pivot_longer(-id) %>% 
  filter(str_detect(value, rgx)) %>% 
  mutate(name = str_remove(name, "_extramea_xy_dimension_MR"))

# A tibble: 2 × 3
     id name  value       
  <int> <chr> <chr>       
1   434 debut 24 x 19 x 13
2   437 fu1   20 x 20 mm

相关问题