2016-07-12 32 views
1

这是我的数据框。当满足两个条件时,如何才能在数据框中提取列名称?

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 

我想提取的列名时,有一个1只在一排,其中column_1 <=2

在这个例子中,唯一可以工作的列是column_3

+1

我不明白你的病情:何不也Column_4(对于行2) – HubertL

+0

因为还有1时'Column_1'大于2。所以,我只是想拉出来的东西,有1只在'Column_1'等于或大于2 – KatherineD

+0

我觉得有一个错字无论是在你的问题或你的措辞 - 你的意思可能是'<=', not '> = ' – natario

回答

0

我有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]

选择
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,所以使用了代号为第二个理论后,简单地颠倒用于行选择的不平等。当我这样做,我现在得到的只是“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" 
+0

我要的是拉出列名时,有在列1,只有当'Column_1'小于2。所以,如果一个列有1时'Column_1'大于2则自动取消资格。 – KatherineD

+0

首先你说Column_1需要是> =,现在<= 2。所以你应该能够使用第二个理论的代码,在简单地逆向行选择的不平等之后。当我这样做时,我确实只会得到“Column_3”。 –

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

列姓名(或名称),然后是

n <- names(a)[which(w)+1] 
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 
相关问题