这似乎很容易,但它让我忙碌了一段时间。
我有一个包含 n 列的数据框 (df) 和一个具有相同数量 (n) 值的向量。
向量中的值是数据框中列中观察值的阈值。所以线索是,如何告诉 R 为每一列使用不同的阈值?
我想将所有观察结果保留在满足每列的各种阈值的数据框中(高于或低于,在示例中无关紧要)。不满足阈值标准的观测值应设置为 0。
我不想要数据框的子集。
任何人都可以帮忙吗?提前非常感谢。
给定一些示例数据和阈值
set.seed(42)
dat <- data.frame(matrix(runif(100), ncol = 10))
## thresholds
thresh <- seq(0.5, 0.95, length.out = 10)
thresh
我们可以使用该mapply()
函数来计算每列(在此)中哪些观察值大于或等于阈值。使用这些索引,我们可以将与索引对应的值替换为0
via:
dat[mapply(">=", dat, thresh)] <- 0
这是行动号召:
> dat
X1 X2 X3 X4 X5
1 0.9148060 0.4577418 0.90403139 0.737595618 0.37955924
2 0.9370754 0.7191123 0.13871017 0.811055141 0.43577158
3 0.2861395 0.9346722 0.98889173 0.388108283 0.03743103
4 0.8304476 0.2554288 0.94666823 0.685169729 0.97353991
5 0.6417455 0.4622928 0.08243756 0.003948339 0.43175125
6 0.5190959 0.9400145 0.51421178 0.832916080 0.95757660
7 0.7365883 0.9782264 0.39020347 0.007334147 0.88775491
8 0.1346666 0.1174874 0.90573813 0.207658973 0.63997877
9 0.6569923 0.4749971 0.44696963 0.906601408 0.97096661
10 0.7050648 0.5603327 0.83600426 0.611778643 0.61883821
X6 X7 X8 X9 X10
1 0.33342721 0.6756073 0.042988796 0.58160400 0.6674265147
2 0.34674825 0.9828172 0.140479094 0.15790521 0.0002388966
3 0.39848541 0.7595443 0.216385415 0.35902831 0.2085699569
4 0.78469278 0.5664884 0.479398564 0.64563188 0.9330341273
5 0.03893649 0.8496897 0.197410342 0.77582336 0.9256447486
6 0.74879539 0.1894739 0.719355838 0.56364684 0.7340943010
7 0.67727683 0.2712866 0.007884739 0.23370340 0.3330719834
8 0.17126433 0.8281585 0.375489965 0.08998052 0.5150633298
9 0.26108796 0.6932048 0.514407708 0.08561206 0.7439746463
10 0.51441293 0.2405447 0.001570554 0.30521837 0.6191592400
> dat[mapply(">=", dat, thresh)] <- 0
> dat
X1 X2 X3 X4 X5
1 0.0000000 0.4577418 0.00000000 0.000000000 0.37955924
2 0.0000000 0.0000000 0.13871017 0.000000000 0.43577158
3 0.2861395 0.0000000 0.00000000 0.388108283 0.03743103
4 0.0000000 0.2554288 0.00000000 0.000000000 0.00000000
5 0.0000000 0.4622928 0.08243756 0.003948339 0.43175125
6 0.0000000 0.0000000 0.51421178 0.000000000 0.00000000
7 0.0000000 0.0000000 0.39020347 0.007334147 0.00000000
8 0.1346666 0.1174874 0.00000000 0.207658973 0.63997877
9 0.0000000 0.4749971 0.44696963 0.000000000 0.00000000
10 0.0000000 0.0000000 0.00000000 0.611778643 0.61883821
X6 X7 X8 X9 X10
1 0.33342721 0.6756073 0.042988796 0.58160400 0.6674265147
2 0.34674825 0.0000000 0.140479094 0.15790521 0.0002388966
3 0.39848541 0.7595443 0.216385415 0.35902831 0.2085699569
4 0.00000000 0.5664884 0.479398564 0.64563188 0.9330341273
5 0.03893649 0.0000000 0.197410342 0.77582336 0.9256447486
6 0.74879539 0.1894739 0.719355838 0.56364684 0.7340943010
7 0.67727683 0.2712866 0.007884739 0.23370340 0.3330719834
8 0.17126433 0.0000000 0.375489965 0.08998052 0.5150633298
9 0.26108796 0.6932048 0.514407708 0.08561206 0.7439746463
10 0.51441293 0.2405447 0.001570554 0.30521837 0.6191592400
注意mapply()
在这种情况下返回的内容是有益的:
> mapply(">=", dat, thresh)
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
[1,] TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE
[3,] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] TRUE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
[5,] TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[6,] TRUE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
[7,] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[8,] FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[9,] TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
[10,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
正是那些用于选择满足阈值的观察的逻辑值。您可以使用与我使用的不同的二元运算符;查看?">"
各种选项。在编写mapply()
调用时,请根据二元运算符的左侧和右侧来考虑它,这样mapply()
调用将给出:
mapply(">", lhs, rhs)
我们可以写的地方
lhs > rhs
更新:由于@DWin 已经回答了关于两个阈值的评论,我将更新我的答案以匹配。
thresh1 <- seq(0.05, 0.5, length.out = 10)
thresh2 <- seq(0.55, 0.95, length.out = 10)
set.seed(42)
dat <- data.frame(matrix(runif(100), ncol = 10))
l1 <- mapply(">", dat, thresh1)
l2 <- mapply("<", dat, thresh2)
我们可以看到哪些元素匹配两个约束:
> l1 & l2
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
[1,] FALSE TRUE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE
[2,] FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE
[3,] TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE
[4,] FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
[5,] FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE TRUE TRUE
[6,] TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE
[7,] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[8,] TRUE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
[9,] FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE FALSE TRUE
[10,] FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE
并且可以使用相同的构造来选择那些匹配的元素:
dat[l1 & l2] <- 0
dat
> dat
X1 X2 X3 X4 X5 X6 X7 X8
1 0.9148060 0.0000000 0.90403139 0.737595618 0.00000000 0.00000000 0.0000000 0.042988796
2 0.9370754 0.7191123 0.13871017 0.811055141 0.00000000 0.00000000 0.9828172 0.140479094
3 0.0000000 0.9346722 0.98889173 0.000000000 0.03743103 0.00000000 0.0000000 0.216385415
4 0.8304476 0.0000000 0.94666823 0.685169729 0.97353991 0.78469278 0.0000000 0.000000000
5 0.6417455 0.0000000 0.08243756 0.003948339 0.00000000 0.03893649 0.8496897 0.197410342
6 0.0000000 0.9400145 0.00000000 0.832916080 0.95757660 0.00000000 0.1894739 0.000000000
7 0.7365883 0.9782264 0.00000000 0.007334147 0.88775491 0.00000000 0.2712866 0.007884739
8 0.0000000 0.0000000 0.90573813 0.000000000 0.00000000 0.17126433 0.8281585 0.375489965
9 0.6569923 0.0000000 0.00000000 0.906601408 0.97096661 0.26108796 0.0000000 0.000000000
10 0.7050648 0.0000000 0.83600426 0.000000000 0.00000000 0.00000000 0.2405447 0.001570554
X9 X10
1 0.00000000 0.0000000000
2 0.15790521 0.0002388966
3 0.35902831 0.2085699569
4 0.00000000 0.0000000000
5 0.00000000 0.0000000000
6 0.00000000 0.0000000000
7 0.23370340 0.3330719834
8 0.08998052 0.0000000000
9 0.08561206 0.0000000000
10 0.30521837 0.0000000000
我比我更喜欢 Gavin 的回答,但这里mapply
使用他的数据的应用略有不同:
mapply(function(x,tt) ifelse(x >= tt, 0, x), dat, thresh)
根据您的第二条评论:我的结构可能比 Gavin 的更普遍
两个阈值向量:
mapply(function(x, lt, ht) ifelse(x <= lt | x >= ht , 0, x), dat, lothresh, hithresh)
不确定它将如何处理数据帧,但以下内容适用于矩阵:
您可以获得df
给定条件下的布尔表示,然后将其用作df
设置值的索引。或者,您可以获取具有匹配字段索引的向量并将其用作索引向量来设置值。希望有帮助。