遍历数据帧列表中的行并提取数据。 (嵌套“应用”功能)

问题描述:

我是R新手,尝试将事情做成“R”方式,这意味着无循环。我想遍历数据框列表,遍历数据框中的每一行,并根据标准提取数据并存储在主数据框中。遍历数据帧列表中的行并提取数据。 (嵌套“应用”功能)

我遇到的一些问题是访问“全局”数据框。我不确定最好的方法(全局变量,通过引用)。

我已经创建了一个抽象的例子来试图表明需要做什么:

rm(list=ls())## CLEAR WORKSPACE 
assign("last.warning", NULL, envir = baseenv())## CLEAR WARNINGS 

# Generate a descriptive name with name and size 
generateDescriptiveName <- function(animal.row, animalList.vector){ 

    name <- animal.row["animal"] 
    size <- animal.row["size"] 

    # if in list of interest prepare name for master dataframe 
    if (any(grepl(name, animalList.vector))){ 
    return (paste0(name, "Sz-", size)) 
    } 

} 

# Animals of interest 
animalList.vector <- c("parrot", "cheetah", "elephant", "deer", "lizard") 

jungleAnimals <- c("ants", "parrot", "cheetah") 
jungleSizes <- c(0.1, 1, 50) 
jungle.df <- data.frame(jungleAnimals, jungleSizes) 


fieldAnimals <- c("elephant", "lion", "hyena") 
fieldSizes <- c(1000, 100, 80) 
field.df <- data.frame(fieldAnimals, fieldSizes) 

forestAnimals <- c("squirrel", "deer", "lizard") 
forestSizes <- c(1, 40, 0.2) 
forest.df <- data.frame(forestAnimals, forestSizes) 

ecosystems.list <- list(jungle.df, field.df, forest.df) 

# Final master list 
descriptiveAnimal.df <- data.frame(name = character(), descriptive.name = character()) 

# apply to all dataframes in list 
lapply(ecosystems.list, function(ecosystem.df){ 
    names(ecosystem.df) <- c("animal", "size") 
    # apply to each row in dataframe 
    output <- apply(ecosystem.df, 1, function(row){generateDescriptiveName(row, animalList.vector)}) 
    if(!is.null(output)){ 
    # Add generated names to unique master list (no duplicates) 
    } 
}) 

最终的结果将是:

  name  descriptive.name 
1 "parrot"   "parrot Sz-0.1" 
2 "cheetah"   "cheetah Sz-50" 
3 "elephant"  "elephant Sz-1000" 
4  "deer"   "deer Sz-40" 
5 "lizard"   "lizard Sz-0.2" 

,因为我觉得我没有使用你的函数generateDescriptiveName()这太麻烦了。我也没有看到在lapply()内使用apply()的理由。这是我尝试生成所需的输出。这并不完美,但我希望它有帮助。

df_list <- lapply(ecosystems.list, function(ecosystem.df){ 
    names(ecosystem.df) <- c("animal", "size") 
    temp <- ecosystem.df[ecosystem.df$animal %in% animalList.vector, ] 
    if(nrow(temp) > 0){ 
    data.frame(name = temp$animal, descriptive.name = paste0(temp$animal, " Sz-", temp$size)) 
    } 
}) 

do.call("rbind",df_list) 
+0

的原因内申请(我现在意识到),是因为我需要执行的大小进行检查(这不是0)。我在我的抽象例子中忽略了这一点。 –