麻烦将数据框转换为r

时间:2016-10-28 11:43:17

标签: r matrix dummy-variable model.matrix

我几天前从R开始,真的可以使用一些帮助:D 我目前有一个带有200个观察值和12个变量的data.frame(它们代表点击次数,所以它们被命名为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

我想将我的数据转换为某种设计矩阵,它基于后台给出的位置表,但是: 作为期望的输出我每次观察需要一个矩阵,再次包含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)

(在后台提供)

**可能有一种更简单,更聪明的解决方案,因为我的值包含rownumber(第一位数字)和columnnr(第二位数字),但我不知道如何按位置将它们写入矩阵**

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

1 个答案:

答案 0 :(得分:0)

您可以获取单独的行并将其转换为矩阵 用一个简单的循环。

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()到a 文件,或者您可以{ccv-like格式write.table()

顺便说一句,你可能会遇到声称循环缓慢且应该是的声明 在R中避免,在某种程度上它是真的,但在这种情况下,它工作得很好 很容易理解。