组合具有相同前缀的数据框列

Combining dataframe columns with same prefix

我有一个数据框,其中包含多个 Boruta 变量选择的结果,其中来自不同来源的环境变量作为预测变量。这些预测变量通常来自不同的来源(例如来源 a、b、c),因此一些预测变量使用不同的后缀进行编码,但代表相同的参数(例如 nitrogen_a、nitrogen_b、nitrogen_c , phosphate_a, phosphate_b 等)。

我需要一种方法来使用类似 grepl() 的方法来识别和分组具有相同名称开头的变量,并将它们折叠成具有共享变量(例如氮、磷酸盐)的单个变量。

请注意,对于每一行,在具有共享变量名称前缀的集合中只有一个变量包含非 NA 值。因此,应该可以通过简单地排除 NA 值将多个变量合并为一个变量。所有变量都是字符向量。

我该怎么做?

您的结果目前为宽格式。我采取的策略是首先使数据变长,删除 NA 行,然后使用更新的列名再次使 table 变宽。这是一个 tidyverse 解决方案:

library(tidyverse)

data = tribble(
  ~ id, ~ x_1, ~ x_2, ~ y_1, ~ y_2,
  "a", 1, NA, 100, NA,
  "b", NA, 2, NA, 200
)

data %>% 
  pivot_longer(-id) %>% 
  filter(!is.na(value)) %>% 
  # Update name so that everything until the _ is kept
  mutate(name = str_extract(name, "[^_]+")) %>% 
  pivot_wider(names_from = "name", values_from = "value")

数据:

> data
# A tibble: 2 x 5
  id      x_1   x_2   y_1   y_2
  <chr> <dbl> <dbl> <dbl> <dbl>
1 a         1    NA   100    NA
2 b        NA     2    NA   200

输出:

# A tibble: 2 x 3
  id        x     y
  <chr> <dbl> <dbl>
1 a         1   100
2 b         2   200