如果某一行包含任何“TRUE”,请保留该行。

4
我有一个像这样的表格
    C1      C2      C3      C4      C5....    
R1  FALSE   FALSE   TRUE    TRUE
R2  FALSE   FALSE   NA      TRUE
R3  NA      NA      NA      TRUE
R4  NA      FALSE   FALSE   FALSE
R5  NA      NA      NA      NA
.
.
.

我希望保留含有至少一个TRUE的所有行。在这张表格中,需要保留R1、R2和R3。然后,我可以从同一张表格中提取另一列(C21)的值。

请给我一些建议,谢谢!

3个回答

9
# Example
x <- 
  matrix(c(FALSE, FALSE, NA, NA, NA, FALSE, FALSE, NA, FALSE, NA, TRUE, NA, NA, FALSE, TRUE, TRUE, FALSE, NA), 
         nrow = 5, ncol = 4, dimnames = list(paste0("R", 1:5), paste0("C", 1:4)))
x
#       C1    C2    C3    C4
# R1 FALSE FALSE  TRUE  TRUE
# R2 FALSE FALSE    NA FALSE
# R3    NA    NA    NA    NA
# R4    NA FALSE FALSE FALSE
# R5    NA    NA  TRUE FALSE

# apply the 'any()' function to the rows, this will return true if there is at
# least one TRUE in the row

apply(x, 1, any)
# R1   R2   R3   R4   R5 
# TRUE   NA   NA   NA TRUE 

# use 'which' to get the row index

which(apply(x, 1, any)) 
# R1 R5 
#  1  5 

# subset the matrix
idx <- which(apply(x, 1, any))

x[idx, ]
#       C1    C2   C3    C4
# R1 FALSE FALSE TRUE  TRUE
# R5    NA    NA TRUE FALSE

我能够使用这个来获取我想要的行。谢谢! - TJ Wu

3
apply(X = df1, 1, any) 

这将为您提供一个逻辑向量,然后您可以相应地使用它。

例如:df1[which(apply(df1, 1, any)), ]


1
没有区别..基本上这只是彼得答案的一行代码; 基本上我只是花了一些时间详细说明我的早期评论(应用任何函数) - GWD

1

我们可以在逻辑矩阵(df1 & !is.na(df1))上使用rowSums,检查总和是否大于0,使用该逻辑向量来子集化行。

Subdf <- df1[rowSums(df1 & !is.na(df1)) >0,]
Subdf
#      C1    C2   C3   C4
#R1 FALSE FALSE TRUE TRUE
#R2 FALSE FALSE   NA TRUE
#R3    NA    NA   NA TRUE

或者我们可以在 rowSums 中使用 na.rm=TRUE。保留HTML,不解释。
df1[rowSums(df1, na.rm=TRUE) > 0,]

我们可以通过 Subdf$C21 或者 Subdf[['C21']](如果初始数据集为 data.frame)或者 Subdf[, 'C21'](对于 matrix)提取'C21'列(在示例中,我没有21列)。

1
他们可能有一个矩阵,在这种情况下,你提到的前两个提取器将不起作用。 - Frank
1
@Frank 是的,我正在考虑添加那行代码。谢谢你提醒我。 - akrun
1
可以直接将函数“any”应用于表格。 - GWD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接