根据对另一个数据集评估的布尔条件对数据集进行子集化,保留满足条件 (R) 的行?

Subsetting a dataset based on a boolean condition assessed on another dataset, keeping the rows that meets the condition (R)?

我有两个数据框,其中第一个 df 的行名与第二个 df 的列名的顺序相同。例如

df1

rows something
n1 34
n2 62
n3 15
n4 29
n5 93

df2

rows n1 n2 n3 n4 n5
r34 2 4 0 0 1
r43 0 5 8 0 2
r75 7 2 5 0 0

我有这行代码:

df1 = df1[-which(colSums(df2) == 0),]

去掉 df1 中的第四行..

但是我 运行 遇到了没有 colSums(df2)==0 的问题,在那种情况下 returns integer(0) 并且代码不起作用

此外,代码行还依赖于 df1 的行名和 df2 的列名顺序相同的事实......这不是最好的假设有。

有什么更好的解决问题的方法,即更稳健?我想我需要在某处使用 %in% ...?

你可以试试(假设rows是数据集的rownames

 df1[colSums(df2)!=0,,drop=FALSE]
 #    something
 #n1        34
 #n2        62
 #n3        15
 #n5        93

假设,如果 colSums 不为 0,这将获取所有行,

  df2$n4[1] <- 3
  df1[colSums(df2)!=0,,drop=FALSE]
  #    something
  #n1        34
  #n2        62
  #n3        15
  #n4        29
  #n5        93

数据

df1 <- structure(list(something = c(34L, 62L, 15L, 29L, 93L)),
.Names = "something", class = "data.frame", row.names = c("n1", 
"n2", "n3", "n4", "n5"))

df2 <-  structure(list(n1 = c(2L, 0L, 7L), n2 = c(4L, 5L, 2L), 
                       n3 = c(0L, 8L, 5L), n4 = c(0L, 0L, 0L), n5 = c(1L, 2L, 0L)),
                  .Names = c("n1", "n2", "n3", "n4", "n5"), class = "data.frame",
                  row.names = c("r34", "r43", "r75"))

akrun 答案的这种变体将允许在 df1 和 df2 之间有不同的 cols/rows 顺序:

result <- df1[colnames(df2[which(colSums(df2)>0)]),,drop=FALSE]

result
#    something
# n1        34
# n2        62
# n3        15
# n5        93

有几个更安全的选择。首先,不要完全按照您说明的原因使用 -which() 结构:不匹配的情况 returns 一个空向量,什么都没有的否定仍然是什么。考虑在 which() 参数中使用逻辑否定。请注意,您实际上并未匹配行名称,因为 which returns 一个数字向量:

df1 = df1[ which(colSums(df2) != 0),]  # numerical indexing, not character
#now a vector

或者使用与行名不匹配的逻辑索引:

df1 = df1[ colSums(df2) != 0,]  # Logical indexing
# now a vector

也可以将其与同时保留数据帧结构的子集一起使用:

> subset(df1, !colSums(df2) == 0)
   something
n1        34
n2        62
n3        15
n5        93

如果您想使用“]”保留数据帧结构,请添加 drop=FALSE 作为第三个参数:

df1[ colSums(df2) != 0, , drop=FALSE]
   something
n1        34
n2        62
n3        15
n5        93