1

これは非常に単純な質問かもしれませんが、R を学ぶためにオンラインや本で答えを見つけることはできません。

既存の行列のベクトルの値に基づいて名前が付けられた変数を持つテーブルを作成しようとしています。これは、変数名が表示される場所で使用しているテーブル (「しきい値」という名前) にベクトルまたは関心がどのように表示されるかの例です。

varname       threshold_1_name threshold_1_value
1   BMXBMI    high             25
2  BMXCALF    low              40
3    BMXHT    high             180 
4   BMXLEG    low              40   
5   BMXSUB    high             32  
6 BMXTHICR    high             65

テーブルには 81 個のレコードがあり、次のようなことをしたいと考えています。

for (i in 1:81) {
  varname1 <- paste(thresholds$varname[i], thresholds$threshold_1_name[i], sep = "_")
  newtable$[varname1] <- ifelse((bigTable$[thresholds$varname[i]] < thresholds$threshold_1_value[i]),1,0)
}

これにより、最初の 6 つの列の名前が BMXBMI_high、BMXCALF_low、BMXHT_high、BMXLEG_low、BMXSUB_high、BMXTHICR_high という名前の 81 個の列を持つ「newtable」が作成されます。私の ifelse ステートメントは問題ないようです。ループの外でテストしたところ、うまくいきました。変数名の作成に間違った構文を使用していると思います。

私が何をすべきか、またはどのように答えを探すべきかについてのアドバイスは大歓迎です。答えが見つからないのは、間違った語彙/検索用語を使用しているためだと思います。ありがとう!

@Ben-あなたが予測したように、ifelse行に問題はありません。ここに bigTable のサンプルがあります (上記の「しきい値」のサンプルに列を追加しました)。そこで問題を分類する方法についてアドバイスを提供するのに役立ちます。bigTable の値が 'thresholds' の値を上回っているか下回っているかに応じて、新しい変数の値を 0/1 としてコーディングしようとしています。

bigTable のサンプル:

  BMXHT BMXBMI BMXLEG BMXCALF BMXWAIST BMXTHICR BMXTRI BMXSUB
1 174.0  24.90     NA    37.5     98.0       NA   12.8   20.4
2 178.3  29.10   45.2    42.6     99.9     56.2   17.4   38.6
3 162.0  22.56   39.7    34.0     81.6     47.0   20.3   16.8
4 162.9  29.39   43.0    37.2     90.7     55.7   26.4   34.2
5 190.1  30.94   46.6    43.7    108.0     64.0   15.5   26.6
6 180.0  30.62   46.0    40.5    112.8     57.1   26.2   NA

すべてを 1 行でコーディングしようとすると、コードが最初のエントリしか読み取っていないというエラーが表示され続けるので、次のコード セグメントを試していますが、これは非常に非効率的であり、まだ機能していません (最初の 2 行は以前に送信したものです)-

varname1 <- paste(thresholds$varname, thresholds$threshold_1_name, sep = "_")
bigTable[varname1[1:5]] <- NA

for (i in 1:5) {
  value <- thresholds$threshold_1_value[i]
  var <- thresholds$varname[i]
  newvar <- varname1[i]
  for(j in 1:10) {
    if(bigTable[var[j]] > value) {bigTable[newvar] = 1}
    else if (bigTable[var[j]] <= value) {bigTable[newvar] = 0}
  }
}

繰り返しますが、あなたが提供できるどんな助けも大歓迎です!

4

1 に答える 1

2

これは、「データフレーム内の変数を使用してデータフレームに多くの列を追加するにはどうすればよいですか」という質問に対する答えです。これは、元の問題の一部であると思われます (どのbigTableように見えるかを見るまで、残りについてはあまりできません)。

# prepare data
thresholds <- read.table(text = "varname       threshold_1_name 
   BMXBMI    high 
  BMXCALF    low
    BMXHT    high
   BMXLEG    low
   BMXSUB    high
 BMXTHICR    high", header = TRUE)

問題のループを追求するために、既存のデータに基づいて新しい列名を作成することができます

varname1 <- NULL
for (i in 1:nrow(thresholds) {
  varname1[i] <- paste(thresholds$varname[i], thresholds$threshold_1_name[i], sep = "_")
}

ただし、ここではループは必要ないことに注意してください。基本的なベクトル操作は、ループと同じ結果になります。

varname1 <- paste(thresholds$varname, thresholds$threshold_1_name, sep = "_")

とにかく、どちらの方法でも、次のように名前を列名として追加できます。

# add new columns to a new dataframe
newtable <- data.frame(setNames(replicate(length(varname1), numeric(0), simplify = F), varname1))

出力は、既存の変数の関数である名前を持つ新しい列です。

 str(newtable)
'data.frame':   0 obs. of  6 variables:
 $ BMXBMI_high  : num 
 $ BMXCALF_low  : num 
 $ BMXHT_high   : num 
 $ BMXLEG_low   : num 
 $ BMXSUB_high  : num 
 $ BMXTHICR_high: num 
于 2012-12-20T22:51:43.357 に答える