1. ホーム
  2. r

[解決済み] R: 重複する 'row.names' を数値データフレームに設定する。

2022-02-08 18:14:17

質問

オリジナルデータフレーム diasyhoras には3つのカラムがあります。

a) "Dia"、"Visitas"、"Hora"。

Dia"列を取り出し、その値をrownamesとして配置する必要があります。

str(diasyhoras)
'data.frame':   175 obs. of  3 variables:
 $ Dia    : Factor w/ 7 levels "Domingo","Jueves",..: 1 3 4 5 2 7 6 1 3 4 ...
 $ Visitas: num  271 493 787 853 285 712 782 16 157 734 ...
 $ Hora   : int  0 0 0 0 0 0 0 1 1 1 ...

最終的な目標は、新しい df (数値のみ) を使ってヒートマップを作成することです。 d3heatmap Rstudioのライブラリ(このパッケージに関するチュートリアルは一つも見つからなかったので、私はベストを尽くしています)。

ということで d3heatmap には、最初の引数は "数値行列 x に NA が含まれない限り TRUE がデフォルトであるべきだと書かれています。

試してみました。

1. diasyhoras2 <- diasyhoras[,-1] #Removes the "Dia" column and creates a new df.

2. rownames(diasyhoras2) <- diasyhoras[,1] 

しかし、ステップ2では、quot;Dia"カラムに重複した値があるため、このエラーが表示されます。

Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
  duplicate 'row.names' are not allowed
In addition: Warning message:
non-unique values when setting 'row.names': ‘Domingo’, ‘Jueves’, ‘Lunes’, ‘Martes’, ‘Miércoles’, ‘Sábado’, ‘Viernes’

UPDATE 1:

これは不可能であり、その必要もなかった。私が必要としたのは、ヒートマップへのフィードのためにデータフレームを "long" から "wide" に変換することです(quot;long" を使用)。 reshape2 ). 基本的なRを使ってそれをやってみるのはいい練習になりました。

どのように解決するのですか?

を使用することができます。 make.names(..., unique = TRUE) 一意な行名を取得するために

rownames(diasyhoras2) <- make.names(diasyhoras[,1], unique = TRUE)

名前に何が起こるかの簡単な例です ...

rep(month.abb[1:2], 3)
# [1] "Jan" "Feb" "Jan" "Feb" "Jan" "Feb"
make.names(rep(month.abb[1:2], 3), unique = TRUE)
# [1] "Jan"   "Feb"   "Jan.1" "Feb.1" "Jan.2" "Feb.2"

残念ながら、日数をデータフレームの行名として使用したい場合、これを回避する方法はありません。 Rでは、エラーにあるように、データフレームでは行名の重複は許されません。 しかし、マトリックスでは許可されているので、そちらを使用した方がよいでしょう。 私は d3heatmap パッケージを使用しているため、行列を使用した場合に希望する結果が得られるかどうかについては、お答えできません。

x <- data.frame(a = rep(month.abb[1:2], 2))
rownames(x) <- x$a
# Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
#   duplicate 'row.names' are not allowed
# In addition: Warning message:
# non-unique values when setting 'row.names': ‘Feb’, ‘Jan’ 
m <- as.matrix(x)
rownames(m) <- x$a
m
#     a    
# Jan "Jan"
# Feb "Feb"
# Jan "Jan"
# Feb "Feb"