gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:56:39 25 4
gpt4 key购买 nike

我编写了一个函数,用于对特定列的求和值使用聚合,并计算该列的行数,按相邻列的值分类列(在本例中为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com