2016-11-29 8 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

私は – Psidom

答えて

1

一つの方法は、正確に1 Sでそれを埋めるために、単純なループを使用し、その後、自分自身のデータフレーム内の最大値と同じ数の行のマトリクスを割り当てることができポジション。

割り当て済みの行列outputを呼び出して、元のデータフレームと同じ列名を付けてみましょう。

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

ここでは、6x3のゼロの行列があります。今度は、単純な入れ子ループがoutputの各列を通り、iで表されるoutputの適切な列位置に1を割り当てます。

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  .  . 

「欠落」変数をすべて構成する場合は、「数値」要素をすべてのレベルの係数に変換するとよいでしょう。例えば

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でのコーディング*各行の一意の値が含まれています*これはと同じではありません、あなたは行番号がその列に表示された行に1を入れたいと思う:6'されますこの例に合わせてソリューションをローカライズします。より良いフレーズの欠如のため、SOオーバーフィット。 –

+0

「min(value):max(value)」を実行するのとは対照的に、もちろん、これはうまくいきますが、欠点を埋めるために 'factor'を使う方法を説明し、ドロップインコードを書くのではないことがポイントです。実際のデータの要素が実際に数値かどうかはわかりません。 –

関連する問題