为了说明,示例数据是:
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