Копировать значения из одного фрейма данных в другой, используя условия для выбора источника и назначения для значений? R Studio - PullRequest
0 голосов
/ 30 октября 2019

У меня есть два кадра данных: первый содержит 1000 наблюдений за 31 переменной. Первые 30 переменных являются случайными числами от 1 до 60, а последняя переменная указывает группу, к которой относится каждое наблюдение (1-5).

Второй кадр данных содержит 10 наблюдений из 6 переменных. Первые 5 переменных представляют разные группы (1-5), а последняя переменная содержит набор тегов для каждого наблюдения, разделенных запятыми.

library(dplyr)
library(DT)
library(purrr)
library(stringr)

data1<-data.frame(
    Type_1=c(229, 509, 522, 556, 1177, 980, 572, 389, 375, 487),
    Type_2=c(229, 478, 484, 393, 1232, 1296, 539, 389, 375, 487),
    Type_3=c(229, 448, 500, 431, 1498, 881, 521, 389, 375, 375),
    Type_4=c(229, 456, 487, 433, 2401, 1053, 435, 389, 375, 487),
    Type_5=c(229, 446, 506, 362, 2221, 641, 468, 389, 375, 487),
    Tag=c("30,20", "52,42", "53,43", "54,44", "56,46", "51,41", "45,55", "11,12,13,14,15,16,17,18,19", "58,48", "59,49" )
)

data2<-data.frame(cbind(replicate(30,sample(10:60,1000,rep=TRUE)), Type=sample(1:5,1000,rep=TRUE)))

По сути, я хочу создать скриптспособен считывать значение каждой ячейки первого кадра данных и заменять его значениями из второго кадра данных. Правило для подстановки следующее: если значение первого кадра данных отсутствует в столбце тегов второго кадра данных, оно становится равным 0 (в этом случае я создал третий кадр данных, чтобы попытатьсятем точнее, насколько возможно с вами ;-)). Но если значение ячейки присутствует в столбце Tag, программа должна прочитать последний столбец первого кадра данных, чтобы узнать, к какой группе он принадлежит. Строка, в которой был найден тег, и столбец, определенный группой, объединяются, чтобы решить, какое значение необходимо создать.

Мне удалось воспроизвести желаемое поведение с помощью циклов:

list<-colnames(dplyr::select(data2,V1:V30))
data3<-data.frame()
for(j in 1:nrow(data2))
{
    for(i in 1:length(colnames(dplyr::select(data2,V1:V30))))
    {
        if (is_empty(str_which(data1[,"Tag"], toString(data2[j,list[i]])))==TRUE)
        {
            data3[j,list[i]]<-0
        }
        if ((is_empty(str_which(data1[,"Tag"], toString(data2[j,list[i]])))==FALSE))
        {
            data3[j,list[i]]<-data1[str_which(data1[,"Tag"], toString(data2[j,list[i]])), data2[j,"Type"]]
        }
    }
}
data3<-cbind(data3, Type=data2$Type)

Но мне нужно найти более эффективный способ, может быть с какой-то функцией, похожей на grepl. Пожалуйста, помогите !!!

Заранее спасибо.

...