0

サンプル データフレームの使用:

df <- structure(list(
  KY27PHY1 = c("4", "5", "5", "4", "-", "4", "2","3", "5", "-", "4", "3", "3", "5", "5"),
  KY27PHY2 = c("4", "4","4", "4", "-", "5", "2", "3", "5", "-", "5", "3", "3", "5", "5"),
  KY27PHY3 = c("5", "4", "4", "4", "-", "5", "1", "4", "5","-", "4", "3", "3", "5", "5")),
                .Names = c("KY27PHY1", "KY27PHY2","KY27PHY3"),
                row.names = 197:211,
                class = "data.frame")

次のコードを使用して、値を数値に変換しています。

df$KY27PHY1<-as.numeric(df$KY27PHY1)
df$KY27PHY2<-as.numeric(df$KY27PHY2)
df$KY27PHY3<-as.numeric(df$KY27PHY3)

df データフレームに欠損値があるため、常に警告メッセージが表示されます。

Warning message:
NAs introduced by coercion 

これは問題ではないと思いますが、コードを改善する方法についてアドバイスが欲しかったので、このメッセージは表示されません。

また、すべての列 (名前で指定) を一度に実行するにはどうすればよいですか?

よろしくお願いします。

4

4 に答える 4

2

2 つの可能性があります。

  1. ありそうもないのは、R で data.frame を作成したことです。次に、最初に整数ベクトルを作成するようにコードを変更するか、変換でエラーが発生-しないNAように置き換えas.numericます。

  2. より可能性が高いのは、data.frame が R の外部から取得されたものであり、おそらくread.tableorread.csv関数のいずれかでそれを読み取ったことです。次に、呼び出しに追加na.strings = "-"するだけで、R はこれら-が として理解されることを認識しNAます。また、これらの列に他の奇妙な項目がない場合、type.convertこれらの関数内で呼び出される関数は、これらが整数でいっぱいの列であることを自動的に検出し、そのように格納します。

于 2013-08-23T11:37:12.117 に答える
1

data.tableは超高速なので、 を使用したらすぐに使用する必要がありますdata.frames。あなたの質問は次のようになります:

library(data.table)
dt = as.data.table(df)
dt[,lapply(.SD,as.numeric)]
    KY27PHY1 KY27PHY2 KY27PHY3
 1:        4        4        5
 2:        5        4        4
 3:        5        4        4
 4:        4        4        4
 5:       NA       NA       NA
 6:        4        5        5
 7:        2        2        1
 8:        3        3        4
 9:        5        5        5
10:       NA       NA       NA
11:        4        5        4
12:        3        3        3
13:        3        3        3
14:        5        5        5
15:        5        5        5

もちろん、「-」は数値に変換できないため、いくつかの警告が表示されます

于 2013-08-23T10:04:16.327 に答える
0

data.frameasで特定の値を作成し、指定されたwithを使用したかのように、出力を変換するためにNA使用する小さな関数を以前に書きました。type.convertread.tablena.strings

関数は次のとおりです。

makemeNA <- function(mydf, NAStrings, fixed = TRUE) {
  dfname <- deparse(substitute(mydf))
  if (!isTRUE(fixed)) {
    mydf <- data.frame(lapply(mydf, function(x) gsub(NAStrings, "", x)))
    NAStrings <- ""
  }
  mydf <- data.frame(lapply(mydf, function(x) type.convert(
    as.character(x), na.strings = NAStrings)))
  mydf
}

ここでそれが使用されています:

makemeNA(df, "-")
#    KY27PHY1 KY27PHY2 KY27PHY3
# 1         4        4        5
# 2         5        4        4
# 3         5        4        4
# 4         4        4        4
# 5        NA       NA       NA
# 6         4        5        5
# 7         2        2        1
# 8         3        3        4
# 9         5        5        5
# 10       NA       NA       NA
# 11        4        5        4
# 12        3        3        3
# 13        3        3        3
# 14        5        5        5
# 15        5        5        5

structureから、数値出力があることがわかります。

str(makemeNA(df, "-"))
# 'data.frame':  15 obs. of  3 variables:
#  $ KY27PHY1: int  4 5 5 4 NA 4 2 3 5 NA ...
#  $ KY27PHY2: int  4 4 4 4 NA 5 2 3 5 NA ...
#  $ KY27PHY3: int  5 4 4 4 NA 5 1 4 5 NA ...

と同様にna.stringsNAStringsinmakemeNA複数形です。ここでは、ダッシュと値「1」を にしNAます。

str(makemeNA(df, c("-", 1)))
# 'data.frame':  15 obs. of  3 variables:
#  $ KY27PHY1: int  4 5 5 4 NA 4 2 3 5 NA ...
#  $ KY27PHY2: int  4 4 4 4 NA 5 2 3 5 NA ...
#  $ KY27PHY3: int  5 4 4 4 NA 5 NA 4 5 NA ...

以下のように、正規表現を使用して値を として設定することもできNAます。

df1 <- data.frame(A = c(1, 2, "-", "not applicable", 5),
                 B = c("not available", 1, 2, 3, 4),
                 C = c("-", letters[1:4]))

「not」または「-」を含む値を次のようにしますNA

makemeNA(df1, "not.*|-", fixed = FALSE)
#    A  B    C
# 1  1 NA <NA>
# 2  2  1    a
# 3 NA  2    b
# 4 NA  3    c
# 5  5  4    d
str(makemeNA(df1, "not.*|-", fixed = FALSE))
# 'data.frame':  5 obs. of  3 variables:
#  $ A: int  1 2 NA NA 5
#  $ B: int  NA 1 2 3 4
#  $ C: Factor w/ 4 levels "a","b","c","d": NA 1 2 3 4
于 2013-08-23T12:13:40.327 に答える
0

を使用sapplyして一度にすべてを実行できますが、最終的には になるため、元に戻すmatrixには でラップする必要があります。as.data.frame警告は、元のデータに数字と一致しない文字があったため、NA. あなたの場合、これらの文字は"-". 警告が印刷されないようにするには、次を使用しますsuppressWarnings

suppressWarnings(as.data.frame(sapply(df,as.numeric)))
   KY27PHY1 KY27PHY2 KY27PHY3
1         4        4        5
2         5        4        4
3         5        4        4
4         4        4        4
5        NA       NA       NA
6         4        5        5
7         2        2        1
8         3        3        4
9         5        5        5
10       NA       NA       NA
11        4        5        4
12        3        3        3
13        3        3        3
14        5        5        5
15        5        5        5
于 2013-08-23T09:35:58.380 に答える