Мой скрипт обрабатывает данные с нескольких сайтов (по одному df на сайт), организованные в виде списка фреймов данных. Для последующего анализа я уже добавил идентификатор соответствия со всех других сайтов (matchID, символ) для каждого сайта (фрейм данных). В зависимости от количества сайтов (= фреймов данных) в каждом проекте (= список, data) существует разное количество столбцов с именем «matchID» (без повторяющихся имен). Мне нужно изменить эти строки, чтобы добавить идентификатор сайта (ID) к «matchID», чтобы результат был «ID_matchID». Обычно я бы делал это с помощью paste (), но поскольку количество столбцов, в которые нужно добавить идентификатор, может варьироваться в зависимости от количества сайтов в проекте и, как следствие, количества фреймов данных в списке, мне нужно добавлять символы в несколько строк без явного использования индекса столбца (я думаю). Буду признателен за любую помощь, особенно за советы по работе с этими NA записями.

Вот что я пробовал до сих пор:

  1. РАБОТА - Извлеките все соответствующие столбцы, содержащие matchID (поскольку все фреймы данных организованы точно так же (количество столбцов и расположение), я могу просто использовать [[1]]):
indx_match<-as.numeric(grep("match", colnames(data[[1]])))
  1. НЕ РАБОТАЕТ - тогда добавление идентификатора ко всем столбцам matchID не работает, потому что второй x [, indx_match] взрывает все.
result<-lapply(data,function(x){x[,indx_match]<-paste(x$ID,x[,indx_match],sep="_");x})

Вот как могут выглядеть данные (в этом примере только 3 сайта, следовательно, два столбца matchID:

> data
[[1]]
datetime            ID    matchID_50 matchID_51
2019-03-01 07:00:00 49         NA         NA
2019-03-01 07:10:00 49         NA         NA
2019-03-01 07:20:00 49    50_09_3    51_11_6
2019-03-01 07:30:00 49    50_12_6    51_05_6
2019-03-01 07:40:00 49    50_11_4    51_11_6
[[2]]
datetime            ID    matchID_49 matchID_51
2019-03-01 07:00:00 50    49_12_6    51_11_6
2019-03-01 07:10:00 50    49_21_6    51_32_0
2019-03-01 07:20:00 50    49_09_3    51_11_3
2019-03-01 07:30:00 50    49_12_6    51_05_6
2019-03-01 07:40:00 50    49_11_4    51_13_9
[[3]]
datetime            ID    matchID_49 matchID_50
2019-03-01 07:00:00 51         NA    50_14_1
2019-03-01 07:10:00 51    49_09_3         NA
2019-03-01 07:20:00 51    49_09_3    50_14_1
2019-03-01 07:30:00 51    49_12_5    50_01_7
2019-03-01 07:40:00 51    49_08_3    50_11_8

И вот как бы в идеале выглядел результат:

> result
[[1]]
datetime            ID    matchID_50    matchID_51
2019-03-01 07:00:00 49            NA            NA
2019-03-01 07:10:00 49            NA            NA
2019-03-01 07:20:00 49    49_50_09_3    49_51_11_6
2019-03-01 07:30:00 49    49_50_12_6    49_51_05_6
2019-03-01 07:40:00 49    49_50_11_4    49_51_11_6
[[2]]
datetime            ID    matchID_49    matchID_51
2019-03-01 07:00:00 50    50_49_12_6    50_51_11_6
2019-03-01 07:10:00 50    50_49_21_6    50_51_32_0
2019-03-01 07:20:00 50    50_49_09_3    50_51_11_3
2019-03-01 07:30:00 50    50_49_12_6    50_51_05_6
2019-03-01 07:40:00 50    50_49_11_4    50_51_13_9
[[3]]
datetime            ID    matchID_49    matchID_50
2019-03-01 07:00:00 51            NA    51_50_14_1
2019-03-01 07:10:00 51    51_49_09_3            NA
2019-03-01 07:20:00 51    51_49_09_3    51_50_14_1
2019-03-01 07:30:00 51    51_49_12_5    51_50_01_7
2019-03-01 07:40:00 51    51_49_08_3    51_50_11_8
0
ChD 26 Ноя 2021 в 14:41

1 ответ

Лучший ответ

Я предполагаю, что ты ищешь

library(dplyr)
result<-lapply(data,function(x){
  x %>% mutate_at(vars(matches("match")),function(z){ifelse(!is.na(z),paste0(.$ID,"_",z),z)})
})
0
runr 26 Ноя 2021 в 17:31
Большое спасибо за быстрый ответ. Ну и да, и нет. Таким образом, он добавляет _ID ко всему, включая НА. Есть ли шанс, что мы сможем сохранить НА в качестве НА?
 – 
ChD
26 Ноя 2021 в 17:29
Извините, пропустил. Отредактировано. Один из способов - попытаться захватить его с помощью ifelse.
 – 
runr
26 Ноя 2021 в 17:31
1
Отлично спасибо! Да, мой первый вопрос уже задан. :) На следующий.
 – 
ChD
26 Ноя 2021 в 17:36