当满足两个条件时,如何提取数据框中的列名?

How can i pull out the column name in a dataframe when two conditions are met?

这是我的数据框。

Name Column_1 Column_2 Column_3 Column_4
A    4        1        0         1
B    5        0        0         1
C    2        0        1         0
D    1        0        1         1

column_1 <=2.

行中有 1 EXCLUSIVELY 时,我想提取列的名称

在此示例中,唯一可用的列是 column_3

关于所问的问题,我有 2 个理论 理论 1:如果我们可以假设编号列中只有 1 和 0,那么也许:

 colSums( dat[ dat$Column_1 >=2,     reduce the dataframe to only qualifying rows
            -1 ]) == 1   # remove letter column and make test.

#-------
Column_1 Column_2 Column_3 Column_4 
   FALSE     TRUE     TRUE    FALSE 

您可以使用它从 names(dat)[-1]

select
dput(dat)
structure(list(Name = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), Column_1 = c(4L, 5L, 2L, 1L), Column_2 = c(1L, 
0L, 0L, 0L), Column_3 = c(0L, 0L, 1L, 1L), Column_4 = c(1L, 1L, 
0L, 1L)), .Names = c("Name", "Column_1", "Column_2", "Column_3", 
"Column_4"), class = "data.frame", row.names = c(NA, -4L))

理论 2:(也得到与您所说的不同的答案

sdat <- dat[ dat$Column_1 >=2,
         -1 ]
 sdat[ rowSums(sdat[-1]) == 1, ]
#-------
  Column_1 Column_2 Column_3 Column_4
2        5        0        0        1
3        2        0        1        0

> names(sdat)[colSums( sdat[ rowSums(sdat[-1]) == 1, ]) == 1]
[1] "Column_3" "Column_4"

首先,问题说 Column_1 需要 >=,现在显示为 <= 2。因此,在简单地反转行 selection 的不等式后,使用第二个理论的代码。当我现在这样做时,我得到的只是“Column_3.

sdat <- dat[ dat$Column_1 <= 2,
         -1 ]
 sdat[ rowSums(sdat[-1]) == 1, ]

 names(sdat)[colSums( sdat[ rowSums(sdat[-1]) == 1, ]) == 1]
#[1] "Column_3"

也许你想要这样的东西:

a <- ...  
w <- apply(a[,-1], 2, FUN= function(x) {all(x[a$Column_1 > 2] == 0) & any(x == 1)})

结果是:

Column_1 Column_2 Column_3 Column_4 
   FALSE    FALSE     TRUE    FALSE 

我们将该函数应用于 a 的所有列(第一列除外),并检查当 Column1 > 2 时该列始终为 0,但至少有一个 1.

然后列名是

n <- names(a)[which(w)+1]

data.table:

library(data.table)
dt <- fread('Name Column_1 Column_2 Column_3 Column_4
A    4        1        0         1
B    5        0        0         1
C    2        0        1         0
D    1        0        1         1')

melt(dt[Column_1<=2 & Column_2+Column_3+Column_4==1], id = "Name")[value==1, .(variable)]

   variable
1: Column_3