【问题标题】:Combining dataframe columns with same prefix组合具有相同前缀的数据框列
【发布时间】:2022-01-20 17:39:34
【问题描述】:

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

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

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

我该怎么办?

【问题讨论】:

  • See here 关于制作一个更易于人们帮助的可重现示例,包括一个可行的数据样本

标签: r grepl


【解决方案1】:

您的结果目前是宽格式。我采取的策略是首先使数据变长,删除NA 行,然后使用更新的列名再次使表变宽。这是一个 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

【讨论】:

  • 这是完美的。非常感谢。这很好地解决了我的问题。我不敢相信我没有想到先转换为长格式!
猜你喜欢
  • 2021-03-06
  • 2022-12-16
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
相关资源
最近更新 更多