3

データ フレームから行を削除し、結果の列を合計したいと思います。内容に基づいて削除する行はわかっていますが、行番号はわかっていません。以下に 3 つの例を示します。そのうちの 2 つが機能します。を使用-して行を削除できるのは、最初の行を削除する場合のみです。何故ですか?

私の質問は次のようなものです: How to delete the first row of a dataframe in R? ただし、行番号に基づいて行が削除されます。

# This works.

state = 'OH'

my.data = read.table(text = "
      county  y1990 y2000
        cc       NA    2
        OH       NA   10
        bb       NA    1
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE)

my.colsums2 <- colSums(my.data[!(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE)
my.colsums2

# y1990 y2000 
#    0     3

# This works.

my.data = read.table(text = "
      county  y1990 y2000
        OH       NA   10
        cc       NA    2
        bb       NA    1
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE)

my.colsums2 <- colSums(my.data[-(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE)
my.colsums2

# y1990 y2000 
#    0     3

# This does not work.

my.data = read.table(text = "
      county  y1990 y2000
        cc       NA    2
        OH       NA   10
        bb       NA    1
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE)

my.colsums2 <- colSums(my.data[-(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE)
my.colsums2

# y1990 y2000 
#    0    11

!との違いについてまだ混乱していると思います-。アドバイスありがとうございます。

4

2 に答える 2

3

自分が何をしているかを覚えておくことは重要だと思います。行または列をサブセット化する条件付き引数を渡す場合、完全な長さの TRUE または FALSE テストである必要があるか、行 (または列) を表す数値である必要があります。

ベクトルを使用した簡単な例を次に示します。条件をコンソールに入力して、条件が提供する内容を確認してください

これらを試してください:

x <- rnorm(20)

## These use integer values for indexing
x[which(x > 1)]  # Numbers > Only those numbers which match

## These use logical values for indexing
x[x > 1]    # Logical > Only those that are true
x[!(x < 1)] # Logical > Only those that are false

悪い行動:

x[-which(x > 1)] # Positive numbers to negative numbers = BAD
x[!which(x > 1)] # Converts numbers to logical = BAD
x[-(x > 1)] # Converts logical to numeric = BAD

あなたの例に固有:

!(my.data$county == state) # Converts TRUE/FALSE to FALSE/TRUE
which(my.data$county != state) # Rows where my.data$count not equal state

個人的にwhich()は、論理値の潜在的な否定または数値の変換を回避するために、すべての場合に使用することをお勧めします。また、「翻訳」しやすい傾向があります。

于 2013-04-02T22:46:04.610 に答える