1

問題が解決しました。投稿の最後に解決策が追加されました!

既存の行の間に行を挿入して(最後に追加するのではなく)、データフレームを「埋める」方法を知りたいです。

私の状況は次のとおりです。

  • 約 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)
}
4

3 に答える 3

3

このようなことを試してください

 insertRowToDF<-function(X,index_after,vector_to_insert){
      stopifnot(length(vector_to_insert) == ncol(X)); # to check valid row to be inserted
      X<-rbind(X[1:index_after,],vector_to_insert,X[(index_after+1):nrow(X),]);
      row.names(X)<-1:nrow(X);
      return (X);
 }

あなたはそれを呼び出すことができます

df<-insertRowToDF(df,16,c(16,0)); # inserting the values (16,0) after the 16th row
于 2013-02-22T10:21:23.757 に答える
3

これははるかに簡単な解決策だと思います。ループは必要ありません。アイデアは、すべての値をゼロに設定して、目的の結果のサイズのベクトルを作成し、適切な値を頻度表のゼロ以外の値に置き換えることです。

> #Let's create sample data
> set.seed(12345)
> var <- sample(100, replace=TRUE)
> 
> 
> #Lets create frequency table
> x <- as.data.frame(table(var))
> x$var <- as.numeric(as.character(x$var))
> head(x)
  var Freq
1   1    3
2   2    1
3   4    1
4   5    2
5   6    1
6   7    2
> #Create a vector of 0s 
> freq <- rep(0, 100)
> #Replace the values in freq for those indices which equal x$var  by x$Freq so that remaining 
> #indices are ones which you intended to insert 
> freq[x$var] <- x$Freq
> head(freq)
[1] 3 1 0 1 2 1
> #cbind data together 
> freqdf <- as.data.frame(cbind(var = 1:100, freq))
> head(freqdf)
  var freq
1   1    3
2   2    1
3   3    0
4   4    1
5   5    2
6   6    1
于 2013-02-22T10:41:34.457 に答える