問題が解決しました。投稿の最後に解決策が追加されました!
既存の行の間に行を挿入して(最後に追加するのではなく)、データフレームを「埋める」方法を知りたいです。
私の状況は次のとおりです。
- 約 1700 のケースと 650 の変数を含むデータ セットがあります。
- 特定の変数には、0 から 100 までの可能な回答カテゴリがあります (質問は「何パーセント...」でした -> 人々は 0 から 100 まで記入できます)。
- ここで、geom_area()でこれらの変数の 1 つの分布を表示したいと思います (それをvarと呼びましょう)。
問題:
1) 0 から 100 までの範囲の X 軸が必要です
2) varのすべての可能なパーセンテージ値が選択されたわけではありません。たとえば、「20%」という回答の 30 倍がありますが、「19%」という回答はありません。x 軸の場合、これは x 位置 19 の y 値が「0」、x 位置 20 の y 値が「30」であることを意味します。
ggplot でプロットするためにデータ (この 1 つの変数) を準備するために、テーブル関数を使用してデータを変換します。
dummy <- as.data.frame(table(var))
これで、回答カテゴリを含む列 "Var1" と、各回答カテゴリの数を含む列 "Freq" ができました。
全部で 57 行あります。これは、44 の可能な回答 (0 から 100% までの値) が示されていないことを意味します。
(私のデータフレームの)例、「Var1」には指定された回答が含まれ、「Freq」にはカウントが含まれます:
Var1 Freq
1 0 1
2 1 16
3 2 32
4 3 44
5 4 14
...
15 14 1
16 15 169 # <-- See next row and look at "Var1"
17 17 2 # <-- "16%" was never given as answer
ここで私の質問は次のとおりです。「Var1」を16に、「Freq」を0に設定できる行16(「Var1」= 15)の後に行を挿入する新しいデータフレームを作成するにはどうすればよいですか?
Var1 Freq
...
15 14 1
16 15 169
17 16 0 # <-- This line I like to insert
18 17 2
私はすでに次のようなことを試しました:
dummy_x <- NULL
dummy_y <- NULL
for (k in 0:100) {
pos <- which(dummy$Var1==k)
if (!is.null(pos)) {
dummy_x <- rbind(dummy_x, c(k))
dummy_y <- rbind(dummy_y, dummy$Freq[pos])
}
else {
dummy_x <- rbind(dummy_x, c(k))
dummy_y <- rbind(dummy_y, 0)
}
}
newdataframe <- data.frame(cbind(dummy_x), cbind(dummy_y))
これにより、dummy_x には 101 個の値 (0 から 101、正しい) が含まれるが、dummy_y には 56 行しか含まれないというエラーが発生します。
結果は次のようにプロットされます。
plot(ggplot(newdataframe, aes(x=Var1, y=Freq)) +
geom_area(fill=barcolors, alpha=0.3) +
geom_line() +
labs(title=fragetitel, x=NULL, y=NULL))
前もって感謝します、ダニエル
この問題の解決策
plotFreq <- function(var, ftitle=NULL, fcolor="blue") {
# create data frame from frequency table of var
# to get answer categorie and counts in separate columns
dummyf <- as.data.frame(table(var))
# rename to "x-axis" and "y-axis"
names(dummyf) <- c("xa", "ya")
# transform $xa from factor to numeric
dummyf$xa <- as.numeric(as.character(dummyf$xa))
# get maximum x-value for graph
maxval <- max(dummyf$xa)
# Create a vector of zeros
frq <- rep(0,maxval)
# Replace the values in freq for those indices which equal dummyf$xa
# by dummyf$ya so that remaining indices are ones which you
# intended to insert
frq[dummyf$xa] <- dummyf$ya
# create new data frame
newdf <- as.data.frame(cbind(var = 1:maxval, frq))
# print plot
ggplot(newdf, aes(x=var, y=frq)) +
# fill area
geom_area(fill=fcolor, alpha=0.3) +
# outline
geom_line() +
# no additional labels on x- and y-axis
labs(title=ftitle, x=NULL, y=NULL)
}