从数据框中删除一列中具有无限值的行,但其他列中没有

Remove rows from dataframe that have an infinite value in one column, but not others

我有一个包含多个列的数据框,其中包含 Inf 和 -Inf 值。我想从数据集中删除其中一列中包含 Inf/-Inf 值的所有行,但我想保留其他列中的 Inf/-Inf。

所以,如果我从以下数据框开始:

 Group<-c("A","B","C","D","E","F","G")
 LRR <- c(Inf, 1,2,3,-Inf,4, 5)
 LRR.var <- c(Inf, Inf, 3, -Inf, -Inf, 6,7)
 data<-data.frame(cbind(Group, LRR, LRR.var))
 data

 Group  LRR  LRR.var
 A      Inf  Inf
 B      1    Inf
 C      2    3
 D      3   -Inf
 E     -Inf -Inf
 F      4    6
 G      5    7

我希望它最终看起来像这样:

Group<-c("B","C","D","F","G")
LRR <- c(1,2,3,4, 5)
LRR.var <- c( Inf, 3,-Inf, 6,7)
data1<-data.frame(cbind(Group, LRR, LRR.var))
data1

Group  LRR  LRR.var
 B      1    Inf
 C      2    3
 D      3   -Inf
 F      4    6
 G      5    7   

我找到的所有从数据框中删除无限值的解决方案都会删除所有无限值,而不仅仅是那些基于数据集中一列的值。感谢您的帮助!

你的变量是因子,所以你应该先把它们转换成数值格式。然后,您可以通过多种方式删除 Inf 值。最简单的方法是使用is.finite到select行。

data <- data.frame(
    Group = c("A","B","C","D","E","F","G"),
    LRR = c(Inf, 1,2,3,-Inf,4, 5),
    LRR.var = c(Inf, Inf, 3, -Inf, -Inf, 6,7), 
    stringsAsFactors = FALSE
)

基地R

data[is.finite(data$LRR),]

  Group LRR LRR.var
2     B   1     Inf
3     C   2       3
4     D   3    -Inf
6     F   4       6
7     G   5       7

你也可以使用变量位置

data[is.finite(data[,2]),]

data.table:

使用 data.table,您不需要第二个维度:

library(data.table)
as.data.table(data)[is.finite(LRR)]

Group LRR LRR.var
1:     B   1     Inf
2:     C   2       3
3:     D   3    -Inf
4:     F   4       6
5:     G   5       7

dplyr:

有了dplyr,就可以用filter

library(dplyr)
data %>% filter(is.finite(LRR))

  Group LRR LRR.var
1     B   1     Inf
2     C   2       3
3     D   3    -Inf
4     F   4       6
5     G   5       7