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

时间:2016-07-12 23:54:18

标签: r subset extraction

这是我的数据框架。

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个专有名称,我想提取列的名称。

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

3 个答案:

答案 0 :(得分:1)

我有两个关于理论问题的理论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]

中进行选择
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需要是&gt; =现在它读取&lt; = 2.因此,在简单地反转行选择的不等式之后,使用第二个理论的代码。当我这样做时,我确实得到了#34; 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"

答案 1 :(得分:0)

也许你想要这样的东西:

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的所有列(第一列除外),并在0时检查该列始终为Column1 > 2,但至少有一列{ {1}}。

列名称是

1

答案 2 :(得分:0)

使用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