当满足两个条件时,如何提取数据框中的列名?
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
这是我的数据框。
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
.
在此示例中,唯一可用的列是 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]
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