からデータを並べ替えることができる「Rコード」を教えてください
AA 100 NA
BB 200 300
CC 300 NA
DD 100 400
に
AA 100 0 0 0
BB 0 200 300 0
CC 0 0 300 0
DD 100 0 0 400
また
100 200 300 400
AA 1 0 0 0
BB 0 1 1 0
CC 0 0 1 0
DD 1 0 0 1
からデータを並べ替えることができる「Rコード」を教えてください
AA 100 NA
BB 200 300
CC 300 NA
DD 100 400
に
AA 100 0 0 0
BB 0 200 300 0
CC 0 0 300 0
DD 100 0 0 400
また
100 200 300 400
AA 1 0 0 0
BB 0 1 1 0
CC 0 0 1 0
DD 1 0 0 1
df <- read.table(text = "AA 100 NA
BB 200 300
CC 300 NA
DD 100 400")
table(data.frame(letters = df[,1], numbers = unlist(df[,-1])))
# numbers
# letters 100 200 300 400
# AA 1 0 0 0
# BB 0 1 1 0
# CC 0 0 1 0
# DD 1 0 0 1
# SAMPLE DATA
myDF <- structure(list(V2 = c(100L, 200L, 300L, 100L), V3 = c(NA, 300L, NA, 400L)), .Names = c("V2", "V3"), class = "data.frame", row.names = c("AA", "BB", "CC", "DD"))
myDf
元のデータフレームであると仮定します
# create columns sequence
Columns <- seq(100, 400, by=100)
newMat <- sapply(Columns, function(c) rowSums(c==myDF, na.rm=T))
# assign names
colnames(newMat) <- Columns
newMat
# 100 200 300 400
# AA 1 0 0 0
# BB 0 1 1 0
# CC 0 0 1 0
# DD 1 0 0 1
c == myDF
TRUE/FALSE値の行列を提供します。
T / Fで算術演算を実行すると、それらは1/0として扱われます
。したがって、
各行がcに等しい回数を示すrowSum()
AA、BBなどの各行に対してを取得できます。
各列の値を反復処理するために使用します。100、200などはリストを返し、そのリストを取得して、適切なマトリックスに単純化します。
sapply
lapply
sapply
次に、名前をクリーンアップしてきれいにします。
値を取得するには、reshape2 パッケージを使用することもできます。
DF <- read.table(text = "AA 100 NA
BB 200 300
CC 300 NA
DD 100 400")
library(reshape2)
dfm <- melt(DF, id = "V1")
dcast(dfm, V1 ~ factor(value), fill = 0)[, -6]
V1 100 200 300 400
1 AA 100 0 0 0
2 BB 0 200 300 0
3 CC 0 0 300 0
4 DD 100 0 0 400
NA は dfm$value の値であり、キャスト データ フレームの最後の列を占めるため、dcast() の最後の列は削除されます。