我有一个包含某些仪器结果的数据框,我想创建一个包含每行总数的新列。因为每次对新数据运行分析时我都有不同数量的工具,所以我需要一个函数来动态计算带有行总计的新列。
简单来说,我的数据框如下所示:
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”函数在此示例中给出了错误的值。除此之外,我的原始数据不是列表格式,所以我不能应用这样的“解决方案”。
我想我把这个问题复杂化了,所以我想知道我怎么能……</p>
- 基于“类型”的数据帧的子集数据,
- 将这些不同长度的单独子集插入到一个新的数据框中,
- 在此数据框中添加一个“总计”列,这是各个子集的正确总和。
这个问题的另一个复杂之处在于,这需要在函数中或以其他动态方式完成,因此我不需要手动对数十个“类型”(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
我有一个令人不安的想法,我在兜圈子……</p>