Получить имя информационного кадра из списка фреймов данных при объединении с функцией Reduce - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь объединить список фреймов данных с помощью функции reduce, и я пытаюсь переименовать окончания '.x' и '.y' для повторяющихся имен столбцов с именами фреймов данных.

dat01_characterization<-data.frame(usubjid = as.factor(sample(10)), col2 = letters[1:10], col3 = letters[1:10])
dat02_consent<-data.frame(usubjid = as.factor(sample(10)), col3 = letters[1:10], col4 = letters[1:10])
dat03_psqi<-data.frame(usubjid = as.factor(sample(10)), col5 = letters[1:10], col3 = letters[1:10])

l2<-mget(ls(pattern="dat0"))
#l2<-list(dat01_characterization,dat02_consent,dat03_psqi)

mergefunction<-function(x,y){
  xname<-substr(names(x),regexpr("_",names(x))+1,nchar(names(x)))
  yname<-substr(names(y),regexpr("_",names(y))+1,nchar(names(y)))
  merged_data<-merge(x,y,by=c("usubjid"),all=TRUE)
  colnames(merged_data)<-gsub("\\.x",paste0("\\.",xname),names(merged_data))
  colnames(merged_data)<-gsub('\\.y',paste0("\\.",yname),names(merged_data))
  return(merged_data)
}
bbb<-Reduce(function(x,y) mergefunction(x,y),l2)

Использование names() для аргументов в функции сокращения даст мне имена столбцов данных, как при использовании names() для объекта списка l2[[1]], а не для объекта более высокого уровня l2[1].Любая идея о том, как получить доступ к фактическим именам данных (например, dat01_characterization и т. Д.)версия с циклом for.Вот как это работает:

dat01_characterization2<-data.frame(usubjid = as.factor(sample(10)), col2 = letters[1:10], col3 = letters[1:10])
dat02_consent2<-data.frame(usubjid = as.factor(sample(10)), col3 = letters[1:10], col4 = letters[1:10])
dat03_psqi2<-data.frame(usubjid = as.factor(sample(10)), col5 = letters[1:10], col3 = letters[1:10])

l3<-mget(ls(pattern="dat0"))

out<-l3[[1]]
for(i in 2:length(l3)){
  yname<-substr(names(l3[i]),regexpr("_",names(l3[i]))+1,nchar(names(l3[i])))
  out<-merge(out,l3[[i]],by=c("usubjid"),all=TRUE)
  colnames(out)<-gsub("\\.x","",names(out))
  colnames(out)<-gsub('\\.y',paste0("\\.",yname),names(out))
}

1 Ответ

0 голосов
/ 18 мая 2018

dat01_characterization, dat02_consent, dat03_psqi - это не имена data.frame, а имена переменных, содержащих содержимое data.frame.Как только вы оценили свой список в l2, оценивая каждую переменную, оригинальные имена теряются.См. Стр. (L2)

...