这是我的数据框架。
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
。
答案 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