2016-10-28 106 views
0

我幾天前開始使用R,並且確實可以使用一些幫助:D 我目前有一個包含200個觀察值和12個變量的數據框(它們表示點擊,所以他們被命名爲c1-c12)。無法將數據幀轉換爲r中的設計矩陣

背景: 用戶在字段上單擊(最多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時,他們點擊該領域(即位置的值是ob的一部分爲所有其他職位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

+0

您能更具體地瞭解您的投入和預期產出? –

+0

當然:用戶在字段上點擊(最多12次)。這些字段分爲6行和4列。這就是爲什麼他們被命名爲11-16,21-26 ...... 41-46。 我現在輸入的是200個觀察值(用戶)及其12個點擊,記錄爲數字。 作爲輸出,我需要每個用戶一個矩陣,包含6行和4列,當他們點擊字段時爲1,當他們沒有時爲0。 – sidebob

+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()更改爲 文件,也可以將write.table()更改爲類似csv的格式。

順便說一句,你可能會遇到聲稱循環很慢,應該 避免R,在某種程度上,它是真實的,但在這種情況下,它工作正常,並 簡單易懂。

+0

Thx爲您的答案Ott !, 您是否首先創建矩陣墊? 你的代碼sniplet目前沒有運行。 我需要一個文本文件中的所有小矩陣,就像1和0一個接一個。我需要他們作爲估計的輸入 – sidebob

+0

非常感謝你!真棒。你讓我今天一整天都感覺很好 – sidebob