r - 自定义函数后,在 R 控制台中调用对象会产生所需的结果,而 "View"来自环境的对象不会

标签 r list function dataframe aggregate

我编写了一个函数,用于对特定列的求和值使用聚合,并计算该列的行数,按相邻列的值分类列(在本例中为 6-12 之间的数字)。 Sum & Count 的列称为Count。分解所依据的列称为 CharLen

然后将两个小的 dfs 放在一个列表中

# Test df1 
    {
  Seq1 <- as.character(rep(c("AAA", "BBB", "CCC"),times = 4))
  Count1 <-  rep(c(12,56,3),times = 4)  
  CharLen1 <- c(6,6,6,7,7,7,9,11,12,8,10,9)
  Testdf1 <- data.frame(Seq1, Count1, CharLen1); colnames(Testdf1) <- c("Seq", "Count", "CharLen")
    rm(Seq1)
    rm(Count1)
    rm(CharLen1)
}

# Test df2  
 {
  Seq2 <- as.character(c("DDD", "EEE", "FFF", "AAA", "BBB", "GGG", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC"))
  Count2 <-  rep(c(7,3,15),times = 4)  
  CharLen2 <- c(8,6,8,7,12,12,12,11,12,8,10,9)
  Testdf2 <- data.frame(Seq2, Count2, CharLen2); colnames(Testdf2) <- c("Seq", "Count", "CharLen")
    rm(Seq2)
    rm(Count2)
    rm(CharLen2)
}


# List these dataframes together  
  List_of_dfs <- lapply(ls(pattern="Testdf[0-9]+"), function(x) get(x))

我将其写入一个函数,目的是向它传递一个包含大量大型且行长不同的数据帧的列表。 (数据框始终具有相同的列号、名称和值类型) “List_of_dfs”

函数

SumCountFunction <- function(i) {
    aggregate(Count ~ CharLen, data=i, FUN = function(x) c(Sum=sum(x), 
    Count=length(x)))
}

将该函数应用于 dfs 列表

SummayCountOut <- lapply(List_of_dfs, SumCountFunction)

完成后,我将其提取到一个 Summary Df 中

SummaryDf <- do.call("rbind", SummayCountOut)

然后在原始List_of_dfs中添加一个对应于原始dataframe位置的数字ID

SummaryDf[["SampleNumber"]] <- rep(seq_along(SummayCountOut), sapply(SummayCountOut, nrow))
    

我的问题和困惑是这样的:

  • 当我生成“SummayCountOut”时,控制台会正确显示两个新数据列:“Count.Sum”和“Count.Count”。
  • 当我转换为单个大型摘要数据框“SummaryDf”时,这也会显示正确的数据。
  • 但是当我查看(SummaryDf)而不是直接调用 SummaryDf 时,我需要的两个新列已经消失了。

据我所知,这是因为对象仅在调用函数时驻留?我尝试使用在另一个 SO 线程中找到的“return”,但这并没有保留新列,我发现的唯一另一件事是“<<-”,这里的其他人已经说过它本质上是邪恶的。

最初我使用 group_by 和 summary 函数在 dplyr 中进行管道传输。我无法将 dplyr 代码放入函数中(我认为是由于 NSE 还是惰性评估?),因此希望改用 base R。

最佳答案

基本上,您的 SumCountFunction 会生成一个包含两列的嵌入矩阵,而不是平面数据框。您可以通过 str() 调用看到这一点,其中 Count 是一个 14 行 2 列的矩阵:

str(SummaryDf)

# 'data.frame': 14 obs. of  2 variables:
#  $ CharLen: num  6 7 8 9 10 11 12 6 7 8 ...
#  $ Count  : num [1:14, 1:2] 71 71 12 15 56 56 3 3 7 29 ...
#   ..- attr(*, "dimnames")=List of 2
#   .. ..$ : NULL
#   .. ..$ : chr  "Sum" "SCount"'data.frame':   14 obs. of  2 variables:

挑战是 aggregate() 一次运行一个分组聚合。使用 c() 时,您将两个聚合一起转换为一个矩阵。

考虑合并两个或两个以上的单独聚合调用,然后重命名列以避免 Count(原始数据帧列)重复。

# TWO-DF MERGE
SumCountFunction <- function(i) {
  merge(aggregate(Count ~ CharLen, data=i, FUN = sum),
        aggregate(Count ~ CharLen, data=i, FUN = length),
        by = "CharLen")       
}

# CHAIN MERGE (ALTERNATIVE)
SumCountFunction <- function(i) {
  dfs <- lapply(c('sum', 'length'), function(f) aggregate(Count ~ CharLen, data=i, FUN = f))
  Reduce(function(x, y) merge(x, y, by = "CharLen"), dfs)

}

SummaryDf <- setNames(do.call("rbind", SummayCountOut), 
                      c("CharLen", "Count.Count", "Count.Sum"))
str(SummaryDf)

# 'data.frame': 14 obs. of  3 variables:
#  $ CharLen    : num  6 7 8 9 10 11 12 6 7 8 ...
#  $ Count.Count: num  71 71 12 15 56 56 3 3 7 29 ...
#  $ Count.Sum  : int  3 3 1 2 1 1 1 1 1 3 ...

关于r - 自定义函数后,在 R 控制台中调用对象会产生所需的结果,而 "View"来自环境的对象不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49016510/

相关文章:

r - 2个逻辑向量的元素之间的快速最小距离(间隔)(取2)

r - 如何使用列主序将向量中的值插入矩阵?

python - 比较两个多维列表的一些问题

mysql - 将列中的所有文本转换为 MySql 中的驼峰式大小写

c++ - 使用双向链表的 Queue 中的 Remove() 函数

python - Python 中带有列表的未解析引用

r - 如何使group_by和lm快速?

r - 如何绘制网络度

c++ - 如何编写返回仅存在于类中的类型的成员函数?

Python:附加到存储在搁置字典中的实例所拥有的列表