1

これは本当に明白な質問だと確信していますが、理解できません。

次のデータセットがあるとします。

test <- data.frame(A = c(1:10),
              B = c(1:10), C = c(1:10),
              P = c(1:10))

そして、「P」という列がある場合は、「Z」という新しい列を作成し、Pから計算されたコンテンツを入れてテストしたいと思います。

私は次のコードを書きました (条件付きで列を作成するためだけに、それを使って何かを実行しようとしていません!):

Clean <- function(data) {
  if("P" %in% colnames(data)) {        
    data$Z <- NA
      }
  else {
    cat("doobedooo")
      }
    }
Clean(test)

しかし、それは何もしていないようで、データセットで実行するだけでうまくいくのに、その理由がわかりませんtest$Z <- NA。そこに「doobedooo」を入れて、最初の条件で false を返すかどうかを確認しました。そうはしていないようです。

if ステートメントがどのように機能するかを単に誤解しただけですか?

4

3 に答える 3

4

関数から値を返し、その値をオブジェクトに代入する必要があります。他の多くの言語とは異なり、R はオブジェクトをその場で変更しません。少なくとも、多くの作業が必要です。

Clean <- function(data) {
    if("P" %in% colnames(data)) {        
        data$Z <- NA
    } else {
        cat("doobedooo"
    }
    return(data)
}
test <- Clean(test)
于 2013-06-27T09:55:02.377 に答える
0

前の回答では、必要なものはすべて提供されています。ただし、これらの問題に対処する別の方法があります。テーブル全体を return() する代わりに、参照によってデータを設定および追加するために使用できます (テーブルの一部を変更したとしても) Renvironment

env <- new.env()
env$test <- test

system.time({
Clean <- function(data) {
  if("P" %in% names(data$test)) {        
    data$test$Z <- NA
  }
  else {
    cat("doobedooo")
  }
}
Clean(env)
})

> env$test
    A  B  C  P  Z
1   1  1  1  1 NA
2   2  2  2  2 NA
3   3  3  3  3 NA
4   4  4  4  4 NA
5   5  5  5  5 NA
6   6  6  6  6 NA
7   7  7  7  7 NA
8   8  8  8  8 NA
9   9  9  9  9 NA
10 10 10 10 10 NA
于 2013-06-27T11:28:39.117 に答える