在不知道行号的情况下删除特定行
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 > 1)
+1 我真的很喜欢这个答案。 (另外,如果您不想要它们,请随时回滚我刚刚所做的编辑。)
让我们警告不要使用x[-which(x > 1)]
(即-which
),因为它会导致灾难。看看如果x <- c(0, 0)
会发生什么。所以我建议完全相反:永远不要使用which
。
看来我是在抱怨自己的错误。好收获@flodel以上是关于在不知道行号的情况下删除特定行的主要内容,如果未能解决你的问题,请参考以下文章
如何在不清除整个队列的情况下从 Resque 队列中删除特定作业?
如何在不使用 cytoscape.js 重绘图形的情况下删除特定边?