2

組み込みのデータ セットでこの問題を再現しようとしましたが、自分自身でのみ発生します。

データのランダムなサブセットを取得すると、次のようになります。

structure(list(ID = structure(c(27L, 1L, 27L, 7L, 5L, 10L, 23L, 
19L, 21L, 26L), .Label = c("AC ", "AJ ", "AT ", "AWY", "BP ", 
"BW ", "CA ", "CK ", "CS ", "DJ ", "EN ", "ES ", "HF ", "HG ", 
"HL ", "HR ", "IP ", "JA ", "JG ", "JN ", "KB ", "KP ", "MJ ", 
"PC ", "RFH", "RPA", "SB ", "SG ", "TM "), class = "factor"), 
TNO = c(30L, 60L, 30L, 10000L, 10000L, 10000L, 120L, 60L, 
120L, 10000L), TNOGroup = structure(c(1L, 1L, 1L, 2L, 2L, 
2L, 2L, 1L, 2L, 2L), .Label = c("Good", "Poor"), class = "factor"), 
x = c(6.15, 7.75, 5.6, 3.05, 3, 4.1, 6, 3.9, 5.85, 3.75), 
View = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L
), .Label = c("Binocular", "Monocular"), class = "factor"), 
Prior = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L
), .Label = c("N", "Y"), class = "factor")), .Names = c("ID", 
"TNO", "TNOGroup", "x", "View", "Prior"), row.names = c(169L, 
49L, 24L, 16L, 9L, 4L, 35L, 18L, 164L, 36L), class = "data.frame")

次に、「SB」などの 2 文字の文字列である ID のすべてのインスタンスを削除してみてください。

data2 <- data[!data$ID %in% c("SB"),] # List syntax in case multiple cases

しかし、データフレームを確認すると、IDが「SB」のケースが残っています。「RPA」などの 3 文字の文字列でこれを試してみると、この ID を持つすべてのケースが期待どおりに削除されます。

なぜこれが発生するのかについての洞察はありますか?

4

1 に答える 1

6

の代わりに%in%、次のように試すことをお勧めgreplします。

mydf[!grepl("CA", mydf$ID), ]
   ID   TNO TNOGroup    x      View Prior
1  AC    60     Good 5.75 Binocular     Y
2 RFH    60     Good 5.60 Monocular     N
3  BP 10000     Poor 3.00 Monocular     N
4  HG    60     Good 4.30 Binocular     Y
6  IP   120     Poor 5.50 Monocular     N
7  JG    60     Good 3.80 Monocular     Y
9 AWY 10000     Poor 3.70 Monocular     Y

私の疑い( を使用して提供されたデータのサブセットを実際に見ないと確認できませんdput) は、"CA"値の周りにスペースが含まれている可能性があるということです。R にとって、"CA"は と同じではありませ"CA "data.frame


このような問題は一般に、読み込まれるファイルに空白がある場合に発生します。デフォルトでは、R はその空白を削除するかどうかを決定する際に保守的ですが、ファミリstrip.whiteと一緒に使用する論理引数が含まれています。read.table

したがって、次を使用してこの問題を回避できる場合があります。

read.csv("yourfile.csv", strip.white = TRUE)

また、これは必ずしもより安全な、またはより強く推奨される%in%. を使用greplすると、意図しない結果が生じる場合があります。たとえば、別の ID が だっ"CAR"た場合、私が共有したオプションを使用すると、それも一致します。


アップデート

strip.whiteすべての問題を解決するわけではありません。CSV に引用符で囲まれたすべての文字列があり、引用符の間にハードコードされたstrip.whiteスペースがある場合、 はそれらのスペースを意図したものとして尊重します。

これが基本的な例です。

データの最初の行にスペースがハードコードされ、データの 2 行目にはハードコードされていない CSV ファイルを作成します。

myTest <- tempfile()
cat(file = myTest, 'A, B, C', 
    '"AA", "BB ", "CC"', 
    '    AA,   BB   , CC', 
    sep = "\n")

read.csvここで、 with と withoutを使用してファイルを読み取り、strip.white = TRUE出力を比較します。

A <- read.csv(myTest)
B <- read.csv(myTest, strip.white = TRUE)
print(A, quote = TRUE)
#          A          B     C
# 1     "AA"     " BB " " CC"
# 2 "    AA" "   BB   " " CC"
print(B, quote = TRUE)
#      A     B    C
# 1 "AA" "BB " "CC"
# 2 "AA"  "BB" "CC"
unlink(myTest)

引用符の間にスペースがハードコーディングされていない行の "B" では、空白は適切に削除されていますが、最初の行に残っています。この問題を解決するは、正規表現を使用して、文字列の先頭と末尾の空白を削除する必要がある場合があります。

于 2013-09-10T16:53:18.657 に答える