这似乎是相当容易的,但它使我的忙,因为一段时间。
我有N列的数据帧(DF)并与值的同一数目(n)的矢量。
在矢量中的值是用于在数据帧中的列的观察阈值。 所以线索,如何让R能够使用不同的阈值,为每列?
我想保持所有在数据帧中符合各种阈值对于每一列的观察(上面或下面,在实施例并不重要)。 这不符合阈值标准的意见应设置为0。
我不希望数据框的子集。
任何人都可以帮忙吗? 非常感谢提前。
这似乎是相当容易的,但它使我的忙,因为一段时间。
我有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
通过:
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
我喜欢加文的答案比我好,但这里有一个稍微不同的应用程序的mapply
使用他的数据:
mapply(function(x,tt) ifelse(x >= tt, 0, x), dat, thresh)
在你的第二个评论的光:我的建筑可能会比加文的更普及
两个阈值向量:
mapply(function(x, lt, ht) ifelse(x <= lt | x >= ht , 0, x), dat, lothresh, hithresh)
不知道怎么回事以数据帧的工作,但与矩阵以下工作:
你可以得到的布尔表示df
给定的条件下,然后用它作为索引df
设定值。 或者你可以用匹配字段的索引向量,并以此为索引向量设定值。 希望帮助。