【问题标题】:Retrieve dataframe name from list of data frames while merging with reduce function与reduce函数合并时从数据框列表中检索数据框名称
【发布时间】:2018-10-28 21:53:34
【问题描述】:

我正在尝试将数据框列表与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)

在reduce函数的参数上使用names()会给我数据框的列名,就像在列表对象l2[[1]]上使用names()而不是在更高级别的对象l2[1]上一样。关于如何访问实际数据框名称(即 dat01_characteristic 等)的任何想法

+++更新+++

它不适用于原始的 reduce 函数,我不得不使用 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))
}

【问题讨论】:

    标签: r merge reduce names


    【解决方案1】:

    dat01_characterization,dat02_consent,dat03_psqi 不是 data.frame 名称,而是包含 data.frame 内容的变量名称。一旦您将列表评估为 l2,评估每个变量,原始名称就会丢失。见 str(l2)

    【讨论】:

    • 嗨 Nicholas2,你是对的,名字丢失了。但是,如果我使用l2&lt;-mget(ls(pattern=past0("dat0"))) 创建列表,我仍然可以通过l2[1] 检索名称。但是我将如何在 reduce 函数中执行此操作?有可能吗?
    • 是的,您可以这样标记列表的槽(注意:paste0 拼写错误且不必要),但 reduce 函数仅适用于列表槽的值,它确实: (i in idx) { out
    • 是的,我必须编写自己的 reduce 函数。现在它起作用了。谢谢!我编辑了我最初的问题并将解决方案放在那里。
    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 2021-09-14
    • 2014-10-22
    • 2021-08-28
    • 2017-12-10
    • 2021-10-24
    • 2019-06-26
    • 2019-11-08
    相关资源
    最近更新 更多