2016-11-29 94 views
1

我想更改一個數據幀,以便它只包含每行的唯一值。例如,假設我有一個這樣的數據幀:R數據幀每行都有唯一的值

person1 person2 person3 
1   2  NA 
4   4  5 
6   NA  NA 

,但我想改變它,使每行有唯一的值:

person1 person2 person3 
1   NA  NA 
NA   2  NA 
NA   NA  NA 
4   4  NA 
NA   NA  5 
6   NA  NA 

最終的目標是,我想做一個關聯矩陣,像這樣:

person1 person2 person3 
1  1   0   0 
2  0   1   0 
3  0   0   0 
4  1   1   0 
5  0   0   1 
6  1   0   0 

有人有關於如何用R做這個建議嗎?

+0

我想你希望把1對其中行號表示該列的行,這是不一樣的*包含在每一行* – Psidom

回答

1

的一種方法是分配自己儘可能多行的矩陣在數據幀中的最高值,然後在正確使用一個簡單的循環來填補它與1小號位置。

我們調用分配的矩陣output,給它與原始數據幀相同的colname。

max.value <- max(df, na.rm=T) 
output <- matrix(0, nrow = max.value, ncol=ncol(df)) 
colnames(output) <- colnames(df) 

現在我們有一個6x3的零矩陣。現在,一個簡單的嵌套循環遍歷output的每列,將1分配給output的適當列位置,如i所示。

for (j in 1:ncol(output)) { #for each column of the output matrix 
    for (i in df[, j]) {  #for the appropriate position in the column according to df 
    output[i, j] <- 1  #assign 1 to that position 
    } 
} 

> output 
    person1 person2 person3 
[1,]  1  0  0 
[2,]  0  1  0 
[3,]  0  0  0 
[4,]  1  1  0 
[5,]  0  0  1 
[6,]  1  0  0 

應該儘可能多的人和你需要的行。

附錄:這裏是測試數據幀的dput

structure(list(person1 = c(1L, 4L, 6L), person2 = c(2L, 4L, NA 
), person3 = c(NA, 5L, NA)), .Names = c("person1", "person2", 
"person3"), class = "data.frame", row.names = c(NA, -3L)) 
+0

這個解決方案正是我一直在尋找的!但是,我得到一個錯誤:錯誤在'[<-'('* tmp *',i,j,value = 1):下標越界。我可以重寫輸出[i,j] < - 1部分以便它不超出範圍嗎? (我不知道這個錯誤來自哪裏..) – trika

+0

這很奇怪。我無法重現錯誤。聽起來像你的輸出矩陣是錯誤的大小,但我不知道爲什麼... – Joe

+0

我試着用更大的'df'隨機數據,它仍然工作。檢查以確保數據框中沒有任何可能會導致矩陣分配的奇怪現象。 – Joe

0

這不會填充「缺失」值(例如沒有人有3),但會創建一個稀疏關聯矩陣。

library(tidyverse) 

data = tribble(
    ~person1, ~person2, ~person3, 
    1,  2,  NA, 
    4,  4,  5, 
    6,  NA,  NA 
) 

data %>% 
    gather(key, value, na.rm = T) %>% 
    xtabs(~ value + key, data = ., sparse = T) 

#> 5 x 3 sparse Matrix of class "dgCMatrix" 
#> person1 person2 person3 
#> 1  1  .  . 
#> 2  .  1  . 
#> 4  1  1  . 
#> 5  .  .  1 
#> 6  1  .  . 

如果要構建所有「缺失」變量,則需要將「number」元素轉換爲具有所有級別的因子。

例如:

data %>% 
    gather(key, value, na.rm = T) %>% 
    # Add factor with levels 1:6 --> 1, 2, 3, 4, 5, 6 
    mutate(value = factor(value, levels = 1:6)) %>% 
    xtabs(~ value + key, data = ., sparse = T) 

#> 6 x 3 sparse Matrix of class "dgCMatrix" 
#> person1 person2 person3 
#> 1  1  .  . 
#> 2  .  1  . 
#> 3  .  .  . 
#> 4  1  1  . 
#> 5  .  .  1 
#> 6  1  .  . 
+0

在'1字面上編碼的唯一值:6'是本地化解決方案以適應示例。由於缺乏一個更好的詞組,這是一個SO裝備。 –

+0

與之相對,做'min(value):max(value)'?當然,這是有效的,但重點是說明如何使用'factor'來填充缺少的值,而不是寫入插入代碼。我們不知道實際數據中的元素是否實際爲數字。 –

相關問題