gpt4 book ai didi

function - 在函数中进行子集化以计算行总计

转载 作者:行者123 更新时间:2023-12-03 06:30:36 24 4
gpt4 key购买 nike

我有一个包含某些仪器结果的数据框,我想创建一个新列,其中包含每行的总计。因为每次对新数据运行分析时我都有不同数量的仪器,所以我需要一个函数来动态计算新列的行总计。

为了简单地解决我的问题,我的数据框如下所示:

    Type    Value
1 A 10
2 A 15
3 A 20
4 A 25
5 B 30
6 B 40
7 B 50
8 B 60
9 B 70
10 B 80
11 B 90

我的目标是实现以下目标:

    A   B   Total
1 10 30 40
2 15 40 55
3 20 50 70
4 25 60 85
5 70 70
6 80 80
7 90 90

我尝试过各种方法,但这种方法最有希望:

myList <- list(a = c(10, 15, 20, 25), b = c(30, 40, 50, 60, 70, 80, 90))
tmpDF <- data.frame(sapply(myList, '[', 1:max(sapply(myList, length))))
> tmpDF
a b
1 10 30
2 15 40
3 20 50
4 25 60
5 NA 70
6 NA 80
7 NA 90
totalSum <- rowSums(tmpDF)
totalSum <- data.frame(totalSum)
tmpDF <- cbind(tmpDF, totalSum)
> tmpDF
a b totalSum
1 10 30 40
2 15 40 55
3 20 50 70
4 25 60 85
5 NA 70 NA
6 NA 80 NA
7 NA 90 NA

尽管这种方式确实成功地组合了两个不同长度的数据帧,但“rowSums”函数在此示例中给出了错误的值。除此之外,我的原始数据不是列表格式,所以我无法应用这样的“解决方案”。

我认为我把这个问题过于复杂化了,所以我想知道我怎样才能......

  • 根据“类型”从数据框中提取数据子集,
  • 将这些不同长度的单独子集插入到新的数据框中,
  • 在此数据框中添加“总计”列,该列是正确的总和各个子集。

这个问题的另一个复杂之处在于,这需要以函数或其他动态方式完成,这样我就不需要手动对数十个“类型”(A、B、C 和等等)在我的数据框中。

这是我到目前为止所做的,虽然不起作用,但说明了我的想法:

TotalDf <- function(x){
tmpNumberOfTypes <- c(levels(x$Type))
for( i in tmpNumberOfTypes){
subSetofData <- subset(x, Type = i, select = Value)
if( i == 1) {
totalDf <- subSetOfData }
else{
totalDf <- cbind(totalDf, subSetofData)}
}
return(totalDf)
}

预先感谢您对此的任何想法或想法,

问候,

EDIT:

感谢 Joris 的评论(见下文),我得到了正确的方向,但是,当尝试将他的解决方案转换为我的数据框架时,我遇到了其他问题。他提出的答案有效,并给出了以下 A 和 B 值的(正确)总和:

> tmp78 <- tapply(DF$value,DF$id,sum)
> tmp78
1 2 3 4 5 6
6 8 10 12 9 10
> data.frame(tmp78)
tmp78
1 6
2 8
3 10
4 12
5 9
6 10

但是,当我在数据框上尝试此解决方案时,它不起作用:

> subSetOfData <- copyOfTradesList[c(1:3,11:13),c(1,10)]
> subSetOfData
Instrument AccountValue
1 JPM 6997
2 JPM 7261
3 JPM 7545
11 KFT 6992
12 KFT 6944
13 KFT 7069
> unlist(sapply(rle(subSetOfData$Instrument)$lengths,function(x) 1:x))
Error in rle(subSetOfData$Instrument) : 'x' must be an atomic vector
> subSetOfData$InstrumentNumeric <- as.numeric(subSetOfData$Instrument)
> unlist(sapply(rle(subSetOfData$InstrumentNumeric)$lengths,function(x) 1:x))
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 3 3
> subSetOfData$id <- unlist(sapply(rle(subSetOfData$InstrumentNumeric)$lengths,function(x) 1:x))
Error in `$<-.data.frame`(`*tmp*`, "id", value = c(1L, 2L, 3L, 1L, 2L, :
replacement has 3 rows, data has 6

我有一个令人不安的想法,我在原地打转……

最佳答案

两个想法:

1) 您可以在 rowSums 中使用 na.rm=T

2) 你怎么知道哪一个必须与哪一个搭配?您可以添加一些索引。

例如:

DF <- data.frame(
type=c(rep("A",4),rep("B",6)),
value = 1:10,
stringsAsFactors=F
)


DF$id <- unlist(lapply(rle(DF$type)$lengths,function(x) 1:x))

现在,您可以轻松应用原始数据帧上的总和

tapply(DF$value,DF$id,sum)

而且,更重要的是,以正确的形式获取数据框:

> DF
type value id
1 A 1 1
2 A 2 2
3 A 3 3
4 A 4 4
5 B 5 1
6 B 6 2
7 B 7 3
8 B 8 4
9 B 9 5
10 B 10 6

> library(reshape)
> cast(DF,id~type)
id A B
1 1 1 5
2 2 2 6
3 3 3 7
4 4 4 8
5 5 NA 9
6 6 NA 10

关于function - 在函数中进行子集化以计算行总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4583507/

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