r - 从 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
解决方案
命名数据框列表。一个简单的方法是使用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
这就是为什么它们在最后被打印。为避免这种情况,您可以使用iwalk
from 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
推荐阅读
- ios - 在 iOS 中使用 Swift 将数据转换为 JSON 字符串
- python - 如何在 python 中添加类标签?
- html - 如何在向下滚动页面上显示下拉菜单?
- c - 在 C 中使用枚举的一些很好的例子是什么
- csv - JSON、CSV 和 Python
- globalize - 即使加载了 CLDR,Globalize.js 也会因 E_MISSING_BUNDLE 失败
- python - 导入模块的 Python 并发
- python - python loop requests.get() 只返回第一个循环
- vb.net - 检查电子邮件是否使用 VB.Net 进行数字签名
- android - 如何在调用其显示方法之前调整对话框的大小?