在不知道行号的情况下删除特定行

Posted

技术标签:

【中文标题】在不知道行号的情况下删除特定行【英文标题】:Deleting a specific row without knowing row number 【发布时间】:2013-03-24 10:15:57 【问题描述】:

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

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

我想我仍然对!- 之间的区别感到困惑。谢谢你的建议。

【问题讨论】:

我想这就是你要找的东西:colSums(my.data[my.data$county != "OH", -1], na.rm = TRUE) 其实最后两个例子是错误的,中间一个是靠运气。布尔变量的否定是通过! 获得的,而不是- 【参考方案1】:

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

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

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

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

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

【讨论】:

即,- 应用于布尔值首先将它们转换为整数(0 和 1),然后更改它们的符号。 使用第三个数据集,你的第三行是: [1] 0 -1 0 我仍然不清楚为什么 -1 0 0 允许获得所需的结果,但 0 -1 0 不允许。我会考虑更多。谢谢你的回答。 是的,谢谢@joran。 -X字面意思被视为-1 * X,在其评估过程中,logical 值被转换为numeric(就像在执行X + 0 时一样)。作为一个有趣的附注,比较+c(TRUE, FALSE)-c(TRUE, FALSE) 的结果。 @MarkMiller -- 它的工作只是一个巧合。或许尝试这样做会更清楚:-(c("cc", "bb", "OH", "OH", "bb") == "OH") . 我在这里傻笑,因为我要说“不!”。我认为否定“-”(负)一个逻辑值是不好的做法。 -TRUE == -1,不是FALSE!LOGICAL = GOOD-LOGICAL = BAD,或者至少不直观。我还能用多少次不!【参考方案2】:

我认为记住你在做什么很重要。当您将条件参数传递给行或列的子集时,它需要是全长 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(),以避免潜在的逻辑否定或数字转换。它也往往更容易“翻译”

【讨论】:

感谢您的回答。请考虑在原始示例中添加推荐的 which 语句以获得所需的结果。我可能很快就会发布一个,但它可能不是最佳的。 这就是我们试图通过这些答案来传达的内容。一个创建数字(行)向量,另一个生成逻辑向量。正确的取决于情况。你不能说!which(cond),因为你混合了两种不同类型的变量。就像你不应该说-(x &gt; 1) +1 我真的很喜欢这个答案。 (另外,如果您不想要它们,请随时回滚我刚刚所做的编辑。) 让我们警告不要使用x[-which(x &gt; 1)](即-which),因为它会导致灾难。看看如果x &lt;- c(0, 0) 会发生什么。所以我建议完全相反:永远不要使用which 看来我是在抱怨自己的错误。好收获@flodel

以上是关于在不知道行号的情况下删除特定行的主要内容,如果未能解决你的问题,请参考以下文章

如何在不清除整个队列的情况下从 Resque 队列中删除特定作业?

如何在不使用 cytoscape.js 重绘图形的情况下删除特定边?

请问SAP为啥不能控制:已经审批的采购申请,在不反审批的情况下,可以被删除?

在不重新加载的情况下更新 UITableViewCell

如何获取 QTableWidget 光标下的行

如何在不删除先前相同值的情况下选择具有重复项的列表中的特定数字?