Переименование столбца данных с текстом из самого столбца - PullRequest
3 голосов
/ 20 октября 2019

Учитывая (упрощенный) фрейм данных в формате

df <- data.frame(a = c(1,2,3,4), 
                 b = c(4,3,2,1), 
                 temp1 = c("-","-","-","foo: 3"), 
                 temp2 = c("-","bar: 10","-","bar: 4")
                 )

a  b   temp1    temp2
1  4     -        -
2  3     -     bar: 10
3  2     -        -
4  1  foo: 3   bar: 4

Мне нужно переименовать все временные столбцы с именами, содержащимися в столбце, Моя конечная цель состоит в следующем:

a  b    foo      bar
1  4     -        -
2  3     -        10
3  2     -        -
4  1     3        4

имена столбцов df и содержащиеся в них данные будут неизвестны, однако столбцы, которые необходимо изменить, будут содержать temp, а разделитель всегда будет иметь вид ":"

Поэтому я могу легко удалитьимя из столбцов, используя dplyr, как это:

df <- df %>% 
  mutate_at(vars(contains("temp")), ~(substr(., str_locate(., ":")+1,str_length(.))))

, но сначала мне нужно переименовать столбцы на основе некоторого метода функции, который сканирует столбец и возвращает значение (я) внутри него, т.е. 1012 *

rename_at(vars(contains("temp")), ~(...some function.....)) 

Согласно приведенному примеру, нет гарантии, что в определенных строках будут данные, поэтому я не могу просто получить значение из строки 1

Любые идеи приветствуются. Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Одна возможность, включающая dplyr и tidyr, может быть:

df %>%
 pivot_longer(names_to = "variables", values_to = "values", -c(a:b)) %>%
 mutate(values = replace(values, values == "-", NA_character_)) %>%
 separate(values, into = c("variables2", "values"), sep = ": ") %>%
 group_by(variables) %>%
 fill(variables2, .direction = "downup") %>%
 ungroup() %>%
 select(-variables) %>%
 pivot_wider(names_from = "variables2", values_from = "values")

      a     b foo   bar  
  <dbl> <dbl> <chr> <chr>
1     1     4 <NA>  <NA> 
2     2     3 <NA>  10   
3     3     2 <NA>  <NA> 
4     4     1 3     4   

Если вы хотите дополнительно заменить NA на -:

df %>%
 pivot_longer(names_to = "variables", values_to = "values", -c(a:b)) %>%
 mutate(values = replace(values, values == "-", NA_character_)) %>%
 separate(values, into = c("variables2", "values"), sep = ": ") %>%
 group_by(variables) %>%
 fill(variables2, .direction = "downup") %>%
 ungroup() %>%
 select(-variables) %>%
 pivot_wider(names_from = "variables2", values_from = "values") %>%
 mutate_at(vars(-a, -b), ~ replace_na(., "-"))

      a     b foo   bar  
  <dbl> <dbl> <chr> <chr>
1     1     4 -     -    
2     2     3 -     10   
3     3     2 -     -    
4     4     1 3     4   
0 голосов
/ 20 октября 2019

Это сделает работу:

colnames(df)[which(grepl("temp", colnames(df)))] <- unique(unlist(sapply(df[,grepl("temp", colnames(df))],

                                                            function(x){gsub("[:].*",

                                                                             "",

                                                                             grep("\\w+",

                                                                                  x,

                                                                                  value = TRUE))})))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...