3

我想从数据框中删除一行并对结果列求和。我知道我要根据其内容删除的行,但不知道它的行号。下面我介绍三个示例,其中两个有效。仅在要删除第一行时使用-删除行。这是为什么?

我的问题与此类似:如何删除 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

6

-这应该消除和之间的区别!,我怀疑你可以从那里拿走它;)

my.data$county == state
# [1]  TRUE FALSE FALSE

!(my.data$county == state)
# [1] FALSE  TRUE  TRUE

-(my.data$county == state)
# [1] -1  0  0

!,它否定布尔值,是您应该在此处使用的运算符。

于 2013-04-02T22:39:58.363 回答
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 回答