data.frame 中列的子集和计数值
Subsetting and counting values in columns in a data.frame
我有一个长度为 100000 的 data.frame。现在我想计算不同的 data.frame 长度(水平从 0.01 到 0.99)这个子集中的正值和负值。
> dput(sumDF[1:100])
structure(c(3000, 2000, 5000, 4000, 1000, 4000, 0, 3000, 4000,
2000, 2000, 3000, 1000, -3000, 2000, 0, 4000, 1000, 1000, 2000,
2000, 2000, 2000, 1000, 3000, 1000, 4000, 3000, 2000, 3000, 1000,
1000, 4000, 2000, 0, 1000, 2000, 5000, 3000, 3000, 0, 2000, 2000,
3000, 1000, -1000, 2000, 1000, 2000, 3000, 2000, 3000, 2000,
2000, 2000, 2000, 3000, 3000, 3000, 2000, 3000, 3000, 1000, 3000,
1000, 2000, 1000, -1000, 0, 2000, 2000, 3000, 0, 3000, 2000,
2000, 5000, 3000, 2000, 1000, 3000, 3000, 4000, 1000, 2000, 2000,
3000, 0, 3000, 1000, 0, 4000, 4000, 2000, 3000, 0, 2000, 4000,
0, 0), .Names = c("modelOutcome1", "modelOutcome2", "modelOutcome3",
"modelOutcome4", "modelOutcome5", "modelOutcome6", "modelOutcome7",
"modelOutcome8", "modelOutcome9", "modelOutcome10", "modelOutcome11",
"modelOutcome12", "modelOutcome13", "modelOutcome14", "modelOutcome15",
"modelOutcome16", "modelOutcome17", "modelOutcome18", "modelOutcome19",
"modelOutcome20", "modelOutcome21", "modelOutcome22", "modelOutcome23",
"modelOutcome24", "modelOutcome25", "modelOutcome26", "modelOutcome27",
"modelOutcome28", "modelOutcome29", "modelOutcome30", "modelOutcome31",
"modelOutcome32", "modelOutcome33", "modelOutcome34", "modelOutcome35",
"modelOutcome36", "modelOutcome37", "modelOutcome38", "modelOutcome39",
"modelOutcome40", "modelOutcome41", "modelOutcome42", "modelOutcome43",
"modelOutcome44", "modelOutcome45", "modelOutcome46", "modelOutcome47",
"modelOutcome48", "modelOutcome49", "modelOutcome50", "modelOutcome51",
"modelOutcome52", "modelOutcome53", "modelOutcome54", "modelOutcome55",
"modelOutcome56", "modelOutcome57", "modelOutcome58", "modelOutcome59",
"modelOutcome60", "modelOutcome61", "modelOutcome62", "modelOutcome63",
"modelOutcome64", "modelOutcome65", "modelOutcome66", "modelOutcome67",
"modelOutcome68", "modelOutcome69", "modelOutcome70", "modelOutcome71",
"modelOutcome72", "modelOutcome73", "modelOutcome74", "modelOutcome75",
"modelOutcome76", "modelOutcome77", "modelOutcome78", "modelOutcome79",
"modelOutcome80", "modelOutcome81", "modelOutcome82", "modelOutcome83",
"modelOutcome84", "modelOutcome85", "modelOutcome86", "modelOutcome87",
"modelOutcome88", "modelOutcome89", "modelOutcome90", "modelOutcome91",
"modelOutcome92", "modelOutcome93", "modelOutcome94", "modelOutcome95",
"modelOutcome96", "modelOutcome97", "modelOutcome98", "modelOutcome99",
"modelOutcome100"))
> levels <- c(0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99)
> levelLength <- length(sumDF) * levels
> levelLength
[1] 1000 5000 10000 20000 30000 40000 50000 60000 70000 80000 90000 95000 99000
我的问题是我得到的 "how long the data.frame" 应该是,但我没有得到 data.frame 中的 "winners" 和 "losers" 的计数。
因此,1 维的值 data.frame,大于 0,赢家,或小于或等于 0,输家。
举个例子,我的 data.frame 的长度为 100000
。在 1% 的水平上,它的长度只有 1000
。以这1000个元素为例,有800个在0以上,200个在0以下或等于0。
如何获得 800
和 200
?
我尝试了以下方法:
countWin <- length(sumDF[1:levelLength > 0])
Warning message:
In 1:levelLength : numerical expression has 13 elements: only the first used
有什么建议吗,如何从我的向量中获取特定数量的元素?
感谢您的回复。
更新
示例:
我的 data.frame sumDF 看起来像这样:
> sumDF[1:3]
modelOutcome1 modelOutcome2 modelOutcome3
3000 2000 5000
我的 data.frame sumDF 的长度为 100000
我想用以下级别长度对我的 data.frame sumDF 进行子集化。
> levelLength
[1] 1000 5000 10000 20000 30000 40000 50000 60000 70000 80000 90000 95000 99000
所以对于 levelLength 1000,我想从 0 到 1000 对 sumDF 进行子集化。
此外,在这个子集中,我想计算所有 vals >0
,我的赢家和所有 <=0
,我的输家。
我的最终 data.frame 应该是这样的:
"levels" "winners" "losers"
0.01 900 100
0.05 2400 2600
0.10 6000 4000
0.20 . .
0.30 . .
0.40
0.50
0.60
0.70
0.80
0.90
0.95
0.99
dput
输出是 vector
。要获取小于 0 的 sum
个值,
sum(sumDF<0)
#[1] 3
我们也可以使用table
来得到输家和赢家的频率
table(sumDF <0)
#FALSE TRUE
# 97 3
如果我们有 data.frame
或 matrix
colSums(sumDF <0)
不确定我是否理解最近的编辑,也许我们在 cut
将对象放入不同的容器后得到 'sumDF' 的频率。使用 cut
,我们可以通过指定 breaks
.
来获取这些组
levellength <- c(1, 5, seq(10, 90, by=10), 95, 99)
tbl <- table(cut(sumDF, breaks=levellength), sumDF)
假设,如果我们需要得到每个组的累计和,在用apply
循环遍历'tbl'的列后使用cumsum
。
tbl1 <- apply(tbl, 2, cumsum)
标签(rownames
)可以通过使用sub
来匹配括号后面的数字((
),并将其替换为1。
rownames(tbl1) <- sub('(?<=\()\d+', '1', rownames(tbl1), perl=TRUE)
tbl1
# sumDF
# -3000 -1000 0 1000 2000 3000 4000 5000
#(1,5] 0 0 0 0 0 0 0 0
#(1,10] 0 0 0 0 0 0 0 0
#(1,20] 0 0 0 0 0 0 0 0
#(1,30] 0 0 0 0 0 0 0 0
#(1,40] 0 0 0 0 0 0 0 0
#(1,50] 0 0 0 0 0 0 0 0
#(1,60] 0 0 0 0 0 0 0 0
#(1,70] 0 0 0 0 0 0 0 0
#(1,80] 0 0 0 0 0 0 0 0
#(1,90] 0 0 0 0 0 0 0 0
#(1,95] 0 0 0 0 0 0 0 0
#(1,99] 0 0 0 0 0 0 0 0
注意:根据输入示例,频率均为 0。
我们还可以通过使用 labels
参数来更改 cut
本身内的标签。我们创建一个自定义标签 ('lvls') 并在 cut
中使用它。除此之外,下面的代码与上面的类似。
lvls <- paste0('(', '1,', c(5,seq(10,90, by=10), 95, 99), ']')
tbl <- table(sumDF, cut(sumDF, breaks=levellength, labels=lvls))
apply(tbl, 1, cumsum)
我有一个长度为 100000 的 data.frame。现在我想计算不同的 data.frame 长度(水平从 0.01 到 0.99)这个子集中的正值和负值。
> dput(sumDF[1:100])
structure(c(3000, 2000, 5000, 4000, 1000, 4000, 0, 3000, 4000,
2000, 2000, 3000, 1000, -3000, 2000, 0, 4000, 1000, 1000, 2000,
2000, 2000, 2000, 1000, 3000, 1000, 4000, 3000, 2000, 3000, 1000,
1000, 4000, 2000, 0, 1000, 2000, 5000, 3000, 3000, 0, 2000, 2000,
3000, 1000, -1000, 2000, 1000, 2000, 3000, 2000, 3000, 2000,
2000, 2000, 2000, 3000, 3000, 3000, 2000, 3000, 3000, 1000, 3000,
1000, 2000, 1000, -1000, 0, 2000, 2000, 3000, 0, 3000, 2000,
2000, 5000, 3000, 2000, 1000, 3000, 3000, 4000, 1000, 2000, 2000,
3000, 0, 3000, 1000, 0, 4000, 4000, 2000, 3000, 0, 2000, 4000,
0, 0), .Names = c("modelOutcome1", "modelOutcome2", "modelOutcome3",
"modelOutcome4", "modelOutcome5", "modelOutcome6", "modelOutcome7",
"modelOutcome8", "modelOutcome9", "modelOutcome10", "modelOutcome11",
"modelOutcome12", "modelOutcome13", "modelOutcome14", "modelOutcome15",
"modelOutcome16", "modelOutcome17", "modelOutcome18", "modelOutcome19",
"modelOutcome20", "modelOutcome21", "modelOutcome22", "modelOutcome23",
"modelOutcome24", "modelOutcome25", "modelOutcome26", "modelOutcome27",
"modelOutcome28", "modelOutcome29", "modelOutcome30", "modelOutcome31",
"modelOutcome32", "modelOutcome33", "modelOutcome34", "modelOutcome35",
"modelOutcome36", "modelOutcome37", "modelOutcome38", "modelOutcome39",
"modelOutcome40", "modelOutcome41", "modelOutcome42", "modelOutcome43",
"modelOutcome44", "modelOutcome45", "modelOutcome46", "modelOutcome47",
"modelOutcome48", "modelOutcome49", "modelOutcome50", "modelOutcome51",
"modelOutcome52", "modelOutcome53", "modelOutcome54", "modelOutcome55",
"modelOutcome56", "modelOutcome57", "modelOutcome58", "modelOutcome59",
"modelOutcome60", "modelOutcome61", "modelOutcome62", "modelOutcome63",
"modelOutcome64", "modelOutcome65", "modelOutcome66", "modelOutcome67",
"modelOutcome68", "modelOutcome69", "modelOutcome70", "modelOutcome71",
"modelOutcome72", "modelOutcome73", "modelOutcome74", "modelOutcome75",
"modelOutcome76", "modelOutcome77", "modelOutcome78", "modelOutcome79",
"modelOutcome80", "modelOutcome81", "modelOutcome82", "modelOutcome83",
"modelOutcome84", "modelOutcome85", "modelOutcome86", "modelOutcome87",
"modelOutcome88", "modelOutcome89", "modelOutcome90", "modelOutcome91",
"modelOutcome92", "modelOutcome93", "modelOutcome94", "modelOutcome95",
"modelOutcome96", "modelOutcome97", "modelOutcome98", "modelOutcome99",
"modelOutcome100"))
> levels <- c(0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99)
> levelLength <- length(sumDF) * levels
> levelLength
[1] 1000 5000 10000 20000 30000 40000 50000 60000 70000 80000 90000 95000 99000
我的问题是我得到的 "how long the data.frame" 应该是,但我没有得到 data.frame 中的 "winners" 和 "losers" 的计数。 因此,1 维的值 data.frame,大于 0,赢家,或小于或等于 0,输家。
举个例子,我的 data.frame 的长度为 100000
。在 1% 的水平上,它的长度只有 1000
。以这1000个元素为例,有800个在0以上,200个在0以下或等于0。
如何获得 800
和 200
?
我尝试了以下方法:
countWin <- length(sumDF[1:levelLength > 0])
Warning message:
In 1:levelLength : numerical expression has 13 elements: only the first used
有什么建议吗,如何从我的向量中获取特定数量的元素?
感谢您的回复。
更新
示例:
我的 data.frame sumDF 看起来像这样:
> sumDF[1:3]
modelOutcome1 modelOutcome2 modelOutcome3
3000 2000 5000
我的 data.frame sumDF 的长度为 100000
我想用以下级别长度对我的 data.frame sumDF 进行子集化。
> levelLength
[1] 1000 5000 10000 20000 30000 40000 50000 60000 70000 80000 90000 95000 99000
所以对于 levelLength 1000,我想从 0 到 1000 对 sumDF 进行子集化。
此外,在这个子集中,我想计算所有 vals >0
,我的赢家和所有 <=0
,我的输家。
我的最终 data.frame 应该是这样的:
"levels" "winners" "losers"
0.01 900 100
0.05 2400 2600
0.10 6000 4000
0.20 . .
0.30 . .
0.40
0.50
0.60
0.70
0.80
0.90
0.95
0.99
dput
输出是 vector
。要获取小于 0 的 sum
个值,
sum(sumDF<0)
#[1] 3
我们也可以使用table
来得到输家和赢家的频率
table(sumDF <0)
#FALSE TRUE
# 97 3
如果我们有 data.frame
或 matrix
colSums(sumDF <0)
不确定我是否理解最近的编辑,也许我们在 cut
将对象放入不同的容器后得到 'sumDF' 的频率。使用 cut
,我们可以通过指定 breaks
.
levellength <- c(1, 5, seq(10, 90, by=10), 95, 99)
tbl <- table(cut(sumDF, breaks=levellength), sumDF)
假设,如果我们需要得到每个组的累计和,在用apply
循环遍历'tbl'的列后使用cumsum
。
tbl1 <- apply(tbl, 2, cumsum)
标签(rownames
)可以通过使用sub
来匹配括号后面的数字((
),并将其替换为1。
rownames(tbl1) <- sub('(?<=\()\d+', '1', rownames(tbl1), perl=TRUE)
tbl1
# sumDF
# -3000 -1000 0 1000 2000 3000 4000 5000
#(1,5] 0 0 0 0 0 0 0 0
#(1,10] 0 0 0 0 0 0 0 0
#(1,20] 0 0 0 0 0 0 0 0
#(1,30] 0 0 0 0 0 0 0 0
#(1,40] 0 0 0 0 0 0 0 0
#(1,50] 0 0 0 0 0 0 0 0
#(1,60] 0 0 0 0 0 0 0 0
#(1,70] 0 0 0 0 0 0 0 0
#(1,80] 0 0 0 0 0 0 0 0
#(1,90] 0 0 0 0 0 0 0 0
#(1,95] 0 0 0 0 0 0 0 0
#(1,99] 0 0 0 0 0 0 0 0
注意:根据输入示例,频率均为 0。
我们还可以通过使用 labels
参数来更改 cut
本身内的标签。我们创建一个自定义标签 ('lvls') 并在 cut
中使用它。除此之外,下面的代码与上面的类似。
lvls <- paste0('(', '1,', c(5,seq(10,90, by=10), 95, 99), ']')
tbl <- table(sumDF, cut(sumDF, breaks=levellength, labels=lvls))
apply(tbl, 1, cumsum)