我有一个数据集,该数据集包含(除了观察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)以上述方式遍历几组变量。
(此外:不一定是小标题,我只是这样做,因为它在视觉上对我来说更清晰)。
感谢您的帮助!
答案 0 :(得分:0)
我会这样使用tidyr
,stringr
和dplyr
:
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)