R - 创建具有相同值频率的变量矩阵
R - Create a Matrix of Variables with the frequency of same values
我在 R 中遇到了一个我自己无法处理的问题。
我有一个看起来像这样的数据框,其中包含更多变量和案例:
ID Var1 Var2 Var3 Var4
1 1 0 1 1
2 0 0 0 0
3 1 1 1 1
4 1 1 0 1
5 1 0 1 0
我喜欢 - 类似于相关矩阵 - 一个显示一对变量具有相同值的频率的矩阵 - 例如值“1”。上面 df 的结果矩阵应该是这样的。
Var1 Var2 Var3 Var4
Var1 2 3 3
Var2 1 2
Var3 2
Var4
也许你能帮上忙。提前谢谢你。
首先创建一个评估数据矩阵来测试你的价值,这里是1。
e <- d[-1] == 1 ## value to test
然后使用 outer
与 FUN
函数横向比较列 sum
两个 TRUE
总和为 [=16= 的频率].从 res
ult 你显然想删除 lower.tri
包括 diag
onal.
FUN <- Vectorize(function(i, j) sum(e[,i] + e[,j] == 2))
(res <- t(outer(1:ncol(e), 1:ncol(e), FUN)))
res[lower.tri(res, diag=1)] <- NA
res
# [,1] [,2] [,3] [,4]
# [1,] NA 2 3 3
# [2,] NA NA 1 2
# [3,] NA NA NA 2
# [4,] NA NA NA NA
您可以像下面那样尝试crossprod
replace(m <- crossprod(as.matrix(df[-1])), lower.tri(m, diag = TRUE), NA)
这给出了
Var1 Var2 Var3 Var4
Var1 NA 2 3 3
Var2 NA NA 1 2
Var3 NA NA NA 2
Var4 NA NA NA NA
数据
> dput(df)
structure(list(ID = 1:5, Var1 = c(1L, 0L, 1L, 1L, 1L), Var2 = c(0L,
0L, 1L, 1L, 0L), Var3 = c(1L, 0L, 1L, 0L, 1L), Var4 = c(1L, 0L,
1L, 1L, 0L)), class = "data.frame", row.names = c(NA, -5L))
我在 R 中遇到了一个我自己无法处理的问题。
我有一个看起来像这样的数据框,其中包含更多变量和案例:
ID Var1 Var2 Var3 Var4
1 1 0 1 1
2 0 0 0 0
3 1 1 1 1
4 1 1 0 1
5 1 0 1 0
我喜欢 - 类似于相关矩阵 - 一个显示一对变量具有相同值的频率的矩阵 - 例如值“1”。上面 df 的结果矩阵应该是这样的。
Var1 Var2 Var3 Var4
Var1 2 3 3
Var2 1 2
Var3 2
Var4
也许你能帮上忙。提前谢谢你。
首先创建一个评估数据矩阵来测试你的价值,这里是1。
e <- d[-1] == 1 ## value to test
然后使用 outer
与 FUN
函数横向比较列 sum
两个 TRUE
总和为 [=16= 的频率].从 res
ult 你显然想删除 lower.tri
包括 diag
onal.
FUN <- Vectorize(function(i, j) sum(e[,i] + e[,j] == 2))
(res <- t(outer(1:ncol(e), 1:ncol(e), FUN)))
res[lower.tri(res, diag=1)] <- NA
res
# [,1] [,2] [,3] [,4]
# [1,] NA 2 3 3
# [2,] NA NA 1 2
# [3,] NA NA NA 2
# [4,] NA NA NA NA
您可以像下面那样尝试crossprod
replace(m <- crossprod(as.matrix(df[-1])), lower.tri(m, diag = TRUE), NA)
这给出了
Var1 Var2 Var3 Var4
Var1 NA 2 3 3
Var2 NA NA 1 2
Var3 NA NA NA 2
Var4 NA NA NA NA
数据
> dput(df)
structure(list(ID = 1:5, Var1 = c(1L, 0L, 1L, 1L, 1L), Var2 = c(0L,
0L, 1L, 1L, 0L), Var3 = c(1L, 0L, 1L, 0L, 1L), Var4 = c(1L, 0L,
1L, 1L, 0L)), class = "data.frame", row.names = c(NA, -5L))