r subscript of dataframe with condition values by a vector
这似乎很容易,但是一段时间以来一直让我忙。
我有一个n列的数据帧(df)和一个具有相同数量(n)值的向量。
向量中的值是数据框中各列中观察值的阈值。因此,提示是如何告诉R为每一列使用不同的阈值?
我想将所有符合所有阈值的观察值保留在数据框中(高于或低于此阈值,在示例中无关紧要)。不满足阈值标准的观察值应设置为0。
我不想要数据框的子集。
有人可以帮忙吗?提前非常感谢。
给出一些示例数据和阈值
1 2 3 4 5 6 | set.seed(42) dat <- data.frame(matrix(runif(100), ncol = 10)) ## thresholds thresh <- seq(0.5, 0.95, length.out = 10) thresh |
我们可以使用
1 | dat[mapply(">=", dat, thresh)] <- 0 |
这是行动电话:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | > 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 |
注意在这种情况下
1 2 3 4 5 6 7 8 9 10 11 12 | > 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 |
,这些逻辑值用于选择满足阈值的观察值。您可以使用与我使用的二进制运算符不同的二进制运算符。有关各种选项,请参见
1 | mapply(">", lhs, rhs) |
我们可能写的地方
1 | lhs > rhs |
更新:由于@DWin已回答有关两个阈值的评论,因此我将更新我的答案以使其匹配。
1 2 3 4 5 6 7 | 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) |
我们可以看到哪些元素符合两个约束:
1 2 3 4 5 6 7 8 9 10 11 12 | > 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 |
和相同的构造可用于选择匹配的元素:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 |
我比我更喜欢加文的答案,但这是
1 | mapply(function(x,tt) ifelse(x >= tt, 0, x), dat, thresh) |
根据您的第二条评论:我的结构可能比Gavin的
更具普遍性
两个阈值向量:
1 | mapply(function(x, lt, ht) ifelse(x <= lt | x >= ht , 0, x), dat, lothresh, hithresh) |
不确定如何处理数据帧,但以下内容适用于矩阵:
您可以在给定条件下获得