无法将数据框转换为 r 中的设计矩阵
Trouble Converting a data frame into a design matrix in r
几天前我开始使用 R,真的需要一些帮助 :D
我目前有一个 data.frame 有 200 个观察值和 12 个变量(它们代表点击,所以它们被命名为 c1-c12)。
背景:
用户点击(最多 12 次)字段。这些字段按 6 行 4 列排序,用户的点击次数记录为数字。:
[,1] [,2] [,3] [,4]
[1,] "11" "21" "31" "41"
[2,] "12" "22" "32" "42"
[3,] "13" "23" "33" "43"
[4,] "14" "24" "34" "44"
[5,] "15" "25" "35" "45"
[6,] "16" "26" "36" "46"
每个值的第一位代表行,第二位代表列。这就是为什么他们被命名为 11-16、21-26 ... 41-46。
值的范围从 c(11:16, 21:26, 31:36, 41:46) 所以有 24 个可能的值。
我能够将数据读入 R,前 10 个观察值如下所示:
我的数据:
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12
1 33 43 63 23 34 32 31 41 61 21 NA NA
2 24 23 22 21 31 61 41 NA NA NA NA NA
3 61 62 63 64 31 32 33 34 41 42 43 44
4 31 32 33 34 21 22 23 24 41 NA NA NA
5 11 12 13 14 22 23 32 33 62 63 42 52
6 51 52 53 54 61 62 63 64 31 32 33 34
7 31 21 61 62 63 64 33 23 NA NA NA NA
8 41 42 43 44 32 33 62 63 52 53 61 64
9 61 62 63 64 21 22 24 23 34 31 41 44
10 51 52 53 54 24 34 21 31 33 23 61 63
我想将我的数据转换成某种设计矩阵,它基于背景中给出的位置 table,但是:
作为 期望的输出 我需要每个观察一个矩阵,再次包含 6 行和 4 列,当他们单击该字段时为 1(即位置值是观察的一部分)和所有其他位置为 0。
第一个观察结果将如下所示:
0 1 1 1 0 1
0 0 1 0 0 0
0 1 1 1 0 1
0 0 1 0 0 0
你能告诉我哪些包等的提示吗?我应该研究一下,也许有提示作为指导或类似的东西?
我的想法是为位置创建一个矩阵,然后将它们与观察结果相乘,但我目前真的很挣扎,不知道从哪里开始。
我在 R 中的位置矩阵现在看起来像这样:
#construct design matrix
alt1 <- c(paste0(1, 1:6))
alt2 <- c(paste0(2, 1:6))
alt3 <- c(paste0(3, 1:6))
alt4 <- c(paste0(4, 1:6))
positions <- matrix(c(alt1, alt2, alt3, alt4), nrow = 6)
(后台提供)
**可能有一种更简单、更聪明的解决方案,因为我的值包含行号(第一位)和列号(第二位),但我不知道如何按位置将它们写入矩阵**
dput(head(data))
structure(list(c1 = c("33", "24", "61", "31", "11", "51"), c2 = c("43",
"23", "62", "32", "12", "52"), c3 = c("63", "22", "63", "33",
"13", "53"), c4 = c("23", "21", "64", "34", "14", "54"), c5 = c("34",
"31", "31", "21", "22", "61"), c6 = c("32", "61", "32", "22",
"23", "62"), c7 = c("31", "41", "33", "23", "32", "63"), c8 = c("41",
"", "34", "24", "33", "64"), c9 = c("61", NA, "41", "41", "62",
"31"), c10 = c("21", NA, "42", "", "63", "32"), c11 = c("", NA,
"43", NA, "42", "33"), c12 = c(NA, NA, "44", NA, "52", "34")), .Names = c("c1",
"c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11",
"c12"), row.names = c(NA, 6L), class = "data.frame")
干杯和感谢,
Sidebob
您可以获取单独的行并将其转换为矩阵
用一个简单的循环。
for(row in 1:nrow(data)) {
x <- as.numeric(data[row,])
i <- x %% 10
j <- x %/% 10
mat <- matrix(0, 6, 6)
mat[cbind(i,j)] <- 1
print(mat)
}
这给
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 1 1 1 0 1
[2,] 0 0 1 0 0 0
[3,] 0 1 1 1 0 1
[4,] 0 0 1 0 0 0
[5,] 0 0 0 0 0 0
[6,] 0 0 0 0 0 0
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 1 1 1 0 1
[2,] 0 1 0 0 0 0
[3,] 0 1 0 0 0 0
[4,] 0 1 0 0 0 0
[5,] 0 0 0 0 0 0
[6,] 0 0 0 0 0 0
...
我不确定您期望哪种输出。你可以打印
(并输出到带有 sink()
的文件),您可以 write()
到
文件,或者您可以 write.table()
类似 csv 的格式。
顺便说一句,您可能会遇到声称循环很慢并且应该
在 R 中避免,在某种程度上是正确的,但在这种情况下它工作正常并且
简单易懂。
几天前我开始使用 R,真的需要一些帮助 :D 我目前有一个 data.frame 有 200 个观察值和 12 个变量(它们代表点击,所以它们被命名为 c1-c12)。
背景: 用户点击(最多 12 次)字段。这些字段按 6 行 4 列排序,用户的点击次数记录为数字。:
[,1] [,2] [,3] [,4]
[1,] "11" "21" "31" "41"
[2,] "12" "22" "32" "42"
[3,] "13" "23" "33" "43"
[4,] "14" "24" "34" "44"
[5,] "15" "25" "35" "45"
[6,] "16" "26" "36" "46"
每个值的第一位代表行,第二位代表列。这就是为什么他们被命名为 11-16、21-26 ... 41-46。 值的范围从 c(11:16, 21:26, 31:36, 41:46) 所以有 24 个可能的值。
我能够将数据读入 R,前 10 个观察值如下所示:
我的数据:
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12
1 33 43 63 23 34 32 31 41 61 21 NA NA
2 24 23 22 21 31 61 41 NA NA NA NA NA
3 61 62 63 64 31 32 33 34 41 42 43 44
4 31 32 33 34 21 22 23 24 41 NA NA NA
5 11 12 13 14 22 23 32 33 62 63 42 52
6 51 52 53 54 61 62 63 64 31 32 33 34
7 31 21 61 62 63 64 33 23 NA NA NA NA
8 41 42 43 44 32 33 62 63 52 53 61 64
9 61 62 63 64 21 22 24 23 34 31 41 44
10 51 52 53 54 24 34 21 31 33 23 61 63
我想将我的数据转换成某种设计矩阵,它基于背景中给出的位置 table,但是: 作为 期望的输出 我需要每个观察一个矩阵,再次包含 6 行和 4 列,当他们单击该字段时为 1(即位置值是观察的一部分)和所有其他位置为 0。 第一个观察结果将如下所示:
0 1 1 1 0 1
0 0 1 0 0 0
0 1 1 1 0 1
0 0 1 0 0 0
你能告诉我哪些包等的提示吗?我应该研究一下,也许有提示作为指导或类似的东西?
我的想法是为位置创建一个矩阵,然后将它们与观察结果相乘,但我目前真的很挣扎,不知道从哪里开始。
我在 R 中的位置矩阵现在看起来像这样:
#construct design matrix
alt1 <- c(paste0(1, 1:6))
alt2 <- c(paste0(2, 1:6))
alt3 <- c(paste0(3, 1:6))
alt4 <- c(paste0(4, 1:6))
positions <- matrix(c(alt1, alt2, alt3, alt4), nrow = 6)
(后台提供)
**可能有一种更简单、更聪明的解决方案,因为我的值包含行号(第一位)和列号(第二位),但我不知道如何按位置将它们写入矩阵**
dput(head(data))
structure(list(c1 = c("33", "24", "61", "31", "11", "51"), c2 = c("43",
"23", "62", "32", "12", "52"), c3 = c("63", "22", "63", "33",
"13", "53"), c4 = c("23", "21", "64", "34", "14", "54"), c5 = c("34",
"31", "31", "21", "22", "61"), c6 = c("32", "61", "32", "22",
"23", "62"), c7 = c("31", "41", "33", "23", "32", "63"), c8 = c("41",
"", "34", "24", "33", "64"), c9 = c("61", NA, "41", "41", "62",
"31"), c10 = c("21", NA, "42", "", "63", "32"), c11 = c("", NA,
"43", NA, "42", "33"), c12 = c(NA, NA, "44", NA, "52", "34")), .Names = c("c1",
"c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11",
"c12"), row.names = c(NA, 6L), class = "data.frame")
干杯和感谢, Sidebob
您可以获取单独的行并将其转换为矩阵 用一个简单的循环。
for(row in 1:nrow(data)) {
x <- as.numeric(data[row,])
i <- x %% 10
j <- x %/% 10
mat <- matrix(0, 6, 6)
mat[cbind(i,j)] <- 1
print(mat)
}
这给
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 1 1 1 0 1
[2,] 0 0 1 0 0 0
[3,] 0 1 1 1 0 1
[4,] 0 0 1 0 0 0
[5,] 0 0 0 0 0 0
[6,] 0 0 0 0 0 0
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 1 1 1 0 1
[2,] 0 1 0 0 0 0
[3,] 0 1 0 0 0 0
[4,] 0 1 0 0 0 0
[5,] 0 0 0 0 0 0
[6,] 0 0 0 0 0 0
...
我不确定您期望哪种输出。你可以打印
(并输出到带有 sink()
的文件),您可以 write()
到
文件,或者您可以 write.table()
类似 csv 的格式。
顺便说一句,您可能会遇到声称循环很慢并且应该 在 R 中避免,在某种程度上是正确的,但在这种情况下它工作正常并且 简单易懂。