0

我有以下数据

x y z

1 2 a

1 2

data[2,3] 是一个因素但没有显示,在数据中,它有很多这样的行。当z什么都没有时如何删除行?我的意思是删除诸如第二行之类的行。

输出应该是

x y z

1 2 a
4

2 回答 2

5

好的。在这里在黑暗中刺了一下。

想象以下数据集:

mydf <- data.frame(
  x = c(.11, .11, .33, .33, .11, .11),
  y = c(.22, .22, .44, .44, .22, .44),
  z = c("a", "", "", "f", "b", ""))
mydf
#      x    y z
# 1 0.11 0.22 a
# 2 0.11 0.22  
# 3 0.33 0.44  
# 4 0.33 0.44 f
# 5 0.11 0.22 b
# 6 0.11 0.44  

根据您的标题和描述的组合(两者似乎都不能完全描述您的问题),我会解码您想要删除第 2 行和第 3 行,而不是第 6 行。换句话说,您想首先检查是否行被复制(大概只有前两列),然后,如果第三列为空,则删除该行。根据这些说明,第 5 行应保留(“z”列不为空白),第 6 行应保留(第 1 列和第 2 列的组合不重复)。

如果是这种情况,这是一种方法:

# Copy the data.frame, "sorting" by column "z"
mydf2 <- mydf[rev(order(mydf$z)), ]
# Subset according to your conditions
mydf2 <- mydf2[duplicated(mydf2[1:2]) & mydf2$z %in% "", ]
mydf2
#      x    y z
# 3 0.33 0.44  
# 2 0.11 0.22  

^^ 这些是我们要删除的数据。删除它们的一种方法是setdiffrownames每个数据集上使用:

mydf[setdiff(rownames(mydf), rownames(mydf2)), ]
#      x    y z
# 1 0.11 0.22 a
# 4 0.33 0.44 f
# 5 0.11 0.22 b
# 6 0.11 0.44  
于 2013-06-09T08:31:07.727 回答
0

一些示例数据:

df = data.frame(x = runif(100), 
                y = runif(100),
                z = sample(c(letters[0:10], ""), 100, replace = TRUE))

> head(df)
          x          y z
1 0.7664915 0.86087017 a
2 0.8567483 0.83715022 d
3 0.2819078 0.85004742 f
4 0.8241173 0.43078311 h
5 0.6433988 0.46291916 e
6 0.4103120 0.07511076  

找出缺失值的第六行。logical您可以使用's (TRUE, FALSE)的向量进行子集化:

df[df$z != "",]

正如@AnandaMahto 评论的那样,您甚至可以检查多个条件:

df[!df$z %in% c("", " "),]
于 2013-06-09T07:25:28.710 回答