计算R中具有较高/较低多列值的观测值的数量

  • 本文关键字:计算 r dplyr tidyr
  • 更新时间 :
  • 英文 :


为了说明,示例数据是:

structure(list(V1 = structure(c(100, 50, -110, 120, 150, 230), format.spss = "F8.0"), 
V2 = structure(c(150, 70, 160, 160, 155, 71), format.spss = "F8.0")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L))

我试图得到的结果是下面的S列和I列:

+------+-----+---+---+
| V1   | V2  | S | I |
+------+-----+---+---+
| 100  | 150 | 2 | 1 |
+------+-----+---+---+
| 50   | 70  | 4 | 0 |
+------+-----+---+---+
| -110 | 160 | 0 | 0 |
+------+-----+---+---+
| 120  | 160 | 0 | 2 |
+------+-----+---+---+
| 150  | 155 | 0 | 2 |
+------+-----+---+---+
| 230  | 71  | 0 | 1 |
+------+-----+---+---+

列S表示V1和V2高于给定行/V1和V2的观测值的观测值数量。例如,对于第一个观测值(V1:100,V2:150(,还有另外两个观测值的V1和V2更高(120/160和150/155(。

另一方面,列I表示相反的情况——V1和V2低于给定行/观测值的观测值的数量。

您可以尝试

library(dplyr)
df %>%
rowwise %>%
mutate(S = sum((V1 < df$V1) & (V2 < df$V2)),
I = sum((V1 > df$V1) & (V2 > df$V2)))
V1    V2     S     I
<dbl> <dbl> <int> <int>
1   100   150     2     1
2    50    70     4     0
3  -110   160     0     0
4   120   160     0     2
5   150   155     0     2
6   230    71     0     1

data.table有趣的答案,这将允许在您有许多V1-n变量的情况下自动生成所有比较名称:

library(data.table)
setDT(dat)
dat[,
c("S","I") := lapply(c(">", "<"),
(x) dat[dat, on=sprintf("%1$s%2$s%1$s", names(dat), x), .N, by=.EACHI]$N)
]
##     V1  V2 S I
##1:  100 150 2 1
##2:   50  70 4 0
##3: -110 160 0 0
##4:  120 160 0 2
##5:  150 155 0 2
##6:  230  71 0 1

最新更新