我有一个数据帧,其中包含多个Boruta变量选择的结果,来自不同来源的环境变量作为预测因子。这些预测因子通常来自不同的来源(例如,来源a、b、c(,因此有些预测因子用不同的后缀编码,但表示相同的参数(例如,nitrogen_a、nitrogen_b、nitygen_c、phosphate_a和phosphate_b等(
我需要一种方法来使用类似grepl((的东西来识别和分组名称开头相同的变量,并将它们折叠成具有共享变量(例如氮、磷酸盐(的单个变量。
注意,对于每一行,具有共享变量名称前缀的集合中只有一个变量包含非NA值。因此,通过简单地排除NA值,应该可以将多个变量合并为一个变量。所有变量都是字符向量。
我该怎么办?
您的结果目前是宽格式的。我采取的策略是首先使数据变长,删除NA
行,然后使用更新的列名再次使表变宽。这里有一个有趣的解决方案:
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