函数适用于列表的一个元素,不适用于完整列表,R

Posted

技术标签:

【中文标题】函数适用于列表的一个元素,不适用于完整列表,R【英文标题】:function works on one element of list, doesn't work on full list, R 【发布时间】:2018-11-16 18:06:31 【问题描述】:

我正在尝试创建一个向数据框添加标签的函数。 数据框的名称包含我需要的信息(日期、选择、治疗等...)。所以我做了一个函数来提取我需要的信息。我有一个包含所有数据框的大列表,当我将函数应用于列表时,它确实为标签创建了新列,但值是 NA-s。每个数据框都具有相同的名称结构,如果我从列表中提取数据框并运行它可以工作的函数。你能帮我找出为什么当我将它应用到列表时它不起作用吗?

这是我的功能:

library(stringr)

tagging <- function(H)

  namey<-deparse(substitute(H)) #get the name of the data frame 
  namey<- str_sub(namey,1, -5) #drop the .csv 
  H$date<-substring(namey,1, 6) # get the first 6 characters containing the date 
  H$selection<- word(namey, -1) #get the last word 
  H$treatment<- word(namey, -2) # get the second last word
  H$REP<- word(namey, -3) # get the third last word 
  return(H)
  

我这样应用它

 ListofData.tagged<-lapply(ListofData, tagging)

数据框的名称如下所示:

180503 xyz1-6 R4_A6_xyz 5 yes.csv

【问题讨论】:

你能证明ListofData包含什么的最小例子吗? 看起来是文件名而不是对象名。我认为您需要遍历ListofData 的名称? 试试map(names(ListofDatalst), ~ str_sub(.x, 1, -5)) 问题是lapply 问题:它将X[[1]],然后X[[2]] 等传递给函数。将cat("namey:", namey, "\n") 放在deparse/substitute 之后,看看函数中的df 名称是什么。 Anders Ellern Bilgrau:ListofData 包含 300 个数据帧。每个数据框都具有相同的结构、相同的变量和相同的名称“结构”。 akrun:文件名就是对象名,因为我导入的.csv文件如下: temp = list.files(pattern="*.csv") ListofData = lapply(temp, read.csv)跨度> 【参考方案1】:

以这种方式导入,以便保留您的姓名:

library(tidyverse)
ListofData <- map(set_names(temp), read_csv)

然后我们修改你的函数添加名称作为第二个参数,将通过imap使用,所以我们也去掉第一行:

tagging <- function(H, namey)
  namey<- str_sub(namey,1, -5) #drop the .csv 
  H$date<-substring(namey,1, 6) # get the first 6 characters containing the date 
  H$selection<- word(namey, -1) #get the last word 
  H$treatment<- word(namey, -2) # get the second last word
  H$REP<- word(namey, -3) # get the third last word 
  return(H)
  

然后imap 将数据传递给H 参数,并将元素名称传递给namey 参数。

ListofData.tagged <- imap(ListofData, tagging)

基础 R 翻译

ListofData <- lapply(setNames(temp,temp), read.csv)
ListofData.tagged <- Map(tagging, ListofData, names(ListofData))

或者如果您不关心命名ListofData 的元素,您可以直接使用Map(tagging, ListofData, temp)(仍然保留tagging 的新定义)。

【讨论】:

以上是关于函数适用于列表的一个元素,不适用于完整列表,R的主要内容,如果未能解决你的问题,请参考以下文章

onClick() 事件适用于一个 div,但不适用于另一个。为啥?

ReactJS onClick 不适用于菜单中的第一个元素

Android FindViewById 仅适用于子布局(列表视图行),不适用于父布局中的 TextView

Ajax 调用仅适用于表的第一行,不适用于下一行

如何有效地保存和加载大列表

Jquery mobile getJSON 适用于浏览器但不适用于移动设备