使用这些变量之一的值重命名变量的子集,该变量遍历任意数量的变量子集

时间:2019-07-02 22:29:05

标签: r

我有一个数据集,该数据集包含(除了观察ID号)变量,每个变量只有一个值,该值应该是几个相关变量的名称的一部分(请参见下面的示例)。这是数据集的微型版本:

df_input <- tribble(
~id,  ~name_code1, ~count1, ~value1, ~name_code2,  ~count2, ~value2,
1,    "A0000",       0,       0,       "A0001",         5,       200,
2,    "A0000",       1,       5,       "A0001",         2,       50,
3,    "A0000",       20,      3000,    "A0001",         3,       30, 
)

因此,变量的每个子集都具有name_code#,count#和value#,其中变量通过具有相同的数字#进行分组。请注意,对于给定的#,name_code#仅接受一个值,即该变量集的唯一标识符。我希望对于任意数量的#,能够将name_code'i'的一个值设置为每个'i'变量名称的前缀,然后从变量名称中删除'i'。

更简洁地说,我想要这个。...

tribble(
  ~id,   ~A0000_count, ~A0000_value, ~A0001_count, ~A0001_value,
1,          0,              0,        5,           200,
2,          1,              5,        2,           50,
3,         20,           3000,        3,           30, 
)

...并且希望能够这样做,而无需单独手动重命名每个变量(并删除“ _code#”变量),因为我有数百个变量集。

真的,除了单独重命名每个变量之外,我什至不知道从哪里开始。但是在真实的数据集中,我有数百个变量的可以重命名,并且希望最大程度地减少编码/拼写错误。通常,我不知道该如何: a)使用另一个变量的值重命名一个变量。 b)以上述方式遍历几组变量。

(此外:不一定是小标题,我只是这样做,因为它在视觉上对我来说更清晰)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我会这样使用tidyrstringrdplyr

library(tidyr)
library(dplyr)
library(stringr)
df_input %>% 
  gather(key, value, -id) %>% 
  mutate(
    key2 = if_else(str_detect(key, "name_code"), value, NA_character_),
    key3 = if_else(str_detect(key, "count") | str_detect(key, "value"), str_sub(key, 1, 5), NA_character_),
  ) %>% 
  fill(key2) %>% 
  filter(!is.na(key3)) %>% 
  mutate(
    key4 = paste(key2, key3, sep = "_"),
    value2 = as.numeric(value)
  ) %>% 
  select(-key, -value, -key2, -key3) %>% 
  spread(key4, value2)