【问题标题】:How to remove rows based on the column values如何根据列值删除行
【发布时间】:2017-10-05 10:38:04
【问题描述】:

我有一个很大的data.frame,例如:

> m <- matrix(c(3,6,2,5,3,3,2,5,4,3,5,3,6,3,6,7,5,8,2,5,5,4,9,2,2), nrow=5, ncol=5)
> colnames(m) <- c("A", "B", "C", "D", "E")
> rownames(m) <- c("a", "b", "c", "d", "e")
> m
  A B C D E
a 3 3 5 7 5
b 6 2 3 5 4
c 2 5 6 8 9
d 5 4 3 2 2
e 3 3 6 5 2

我想删除所有行,其中 A 和/或 B 列的值大于 C D 和 E 列。 所以在这种情况下,行 b、d、e 应该被删除,我应该得到这个:

  A B C D E
a 3 3 5 7 5
c 2 5 6 8 9

无法一一删除,因为 data.frame 有超过一百万行。 谢谢

【问题讨论】:

  • 如果 A,B 的最小值大于 C,D,E 的最大值,是否要删除它们?
  • 我会建议使用data.frame 而不是matrix 对象和subset 函数

标签: r


【解决方案1】:

使用子集,连同pmin()pmax() 来保留您想要的值。我不确定我是否完全理解您的标准(您说“C D 和 E”,但由于您想丢弃行 e,我认为您的意思是 C、D E),但以下似乎可以满足您的要求:

> m[pmax(m[,"A"],m[,"B"])<=pmin(m[,"C"],m[,"D"],m[,"E"]),]
  A B C D E
a 3 3 5 7 5
c 2 5 6 8 9

【讨论】:

  • 确切地说,我想删除 A 和/或 B 列的最小值大于 C、D 和 E 列的最大值的行。谢谢
【解决方案2】:
# creating the df
m <- matrix(c(3,6,2,5,3,3,2,5,4,3,5,3,6,3,6,7,5,8,2,5,5,4,9,2,2), nrow=5, ncol=5)
colnames(m) <- c("A", "B", "C", "D", "E")
rownames(m) <- c("a", "b", "c", "d", "e")

# initialize as data frame. 
m <- as.data.frame(m)
df_n <- m
for(i in 1:nrow(m)){
  #print(i)
  #print(paste(max(m[,1:2][i,]), max(m[,3:5][i,])))
  if(max(m[,1:2][i,]) > (max(m[,3:4][i,])) || max(m[,1:2][i,]) > ((m[,5])[i])){
    #df_n <- m[-i,]
    df_n[i,] <- NA
  }
}
#df_n
df_n <- df_n[complete.cases(df_n), ]
print(df_n)

Results
> print(df_n)
  A B C D E
a 3 3 5 7 5
c 2 5 6 8 9

【讨论】:

  • @loannis 这玩弄了我,直到我意识到你想要或指的是 C、D 或 E。请更正你的问题。
【解决方案3】:

这是apply 的另一个解决方案:

m[apply(m, 1, function(x) max(x[1], x[2]) < min(x[3], x[4], x[5])),]

结果:

  A B C D E
a 3 3 5 7 5
c 2 5 6 8 9

我认为您的实际意思是删除 max(A, B) > min(C, D, E) 的行,这意味着将行保留在 all A 和 B 的值小于 所有 C、D 和 E 的值。

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 2019-02-24
    • 2019-05-29
    • 2019-07-06
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多