首页 > 解决方案 > 从 R 中的数据框列表中提取名称:现有解决方案不起作用

问题描述

我有一个数据框列表。使用 rmarkdown 我试图打印每个数据帧的名称,确定是否有负值,如果有负数,则将最小值添加到整个数据帧。

我找到的打印名称的解决方案都指向names(df)or deparse(substitute(df))。这些解决方案都不起作用。我认为 lapply 保留了名称。

第二个问题:为什么最后打印 NULL 以及如何防止这种情况?

代码示例:

df1 <- data.frame(c(1,2,3), c(0,1,2), c(0,2,1))
df2 <- data.frame(c(-1,2,3), c(0,1,2), c(0,2,1))
df3 <- data.frame(c(1,2,3), c(0,1,2), c(0,2,1))
matrices <- list(df1, df2, df3)

negatives <- function(x){
  numNeg <- sum(x<0)
  smallest <- min(x)
  cat("\n\nNumber of negative expression values: ", numNeg)
  cat("\n\nSmallest value: ", smallest)
  x <- x - smallest
  cat("\n\nAll expression values positive: ", all(x>=0))
}

correction <-function(m) {
  positives <- all(m>=0)
  cat("\n\n\n", deparse(substitute(m)))
  cat("\n\nAll expression values positive: ", positives)
  if(positives == FALSE) {
    negatives(m)
  }
  
}

lapply(matrices, correction)

输出:





 X[[i]]

All expression values positive:  TRUE


 X[[i]]

All expression values positive:  FALSE

Number of negative expression values:  1

Smallest value:  -1

All expression values positive:  TRUE


 X[[i]]

All expression values positive:  TRUE[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

标签: rlistdataframefunction

解决方案


命名数据框列表。一个简单的方法是使用tibble::lst

matrices <- tibble::lst(df1, df2, df3)

将 更改correction为接受两个参数。数据框和列表名称。

correction <-function(m, y) {
  positives <- all(m>=0)
  cat("\n\n\n", y)
  cat("\n\nAll expression values positive: ", positives)
  if(!positives) {
    negatives(m)
  } 
}

你没有返回任何东西,lapply只是打印它,在这种情况下lapply返回 aNULL这就是为什么它们在最后被打印。为避免这种情况,您可以使用iwalkfrom purrr

purrr::iwalk(matrices, correction)

#df1

#All expression values positive:  TRUE


# df2

#All expression values positive:  FALSE

#Number of negative expression values:  1

#Smallest value:  -1

#All expression values positive:  TRUE


# df3

#All expression values positive:  TRUE

推荐阅读