R 从布尔表中保留具有现有值的列表

R 从布尔表中保留具有现有值的列表,r,R,具有如下布尔帧: dftest <- data.frame(id = c("A1","A2","A3","A4","A5"), stock1= c(1,0,0,1,0), stock2 = c(1,1,0,1,0), stock3 = c(0,1,0,0,0)) id stock1 stock2 stock3 A1 1 1 0 A2 0 1 1 A3 0 0 0 A4 1 1

具有如下布尔帧:

dftest <- data.frame(id = c("A1","A2","A3","A4","A5"), stock1= c(1,0,0,1,0), stock2 = c(1,1,0,1,0), stock3 = c(0,1,0,0,0))



id stock1 stock2 stock3
A1      1      1      0
A2      0      1      1
A3      0      0      0
A4      1      1      0
A5      0      0      0
stock1 = c("A1,","A4")
stock2 = c("A1","A2","A4")
stock3 = c("A2")

一种具有
lappy
和简单子集的解决方案:

lapply(names(dftest)[-1], function(x) dftest[dftest[x] == 1, 'id'])

#[[1]]
#[1] A1 A4
#5 Levels: A1 A2 A3 ... A5

#[[2]]
#[1] A1 A2 A4
#5 Levels: A1 A2 A3 ... A5

#[[3]]
#[1] A2
#5 Levels: A1 A2 A3 ... A5

您的id列当前为factor类型。如果您不想看到输出中的级别,只需将其转换为字符,即
dftest$id一个具有
lapply
和简单子集的解决方案:

lapply(names(dftest)[-1], function(x) dftest[dftest[x] == 1, 'id'])

#[[1]]
#[1] A1 A4
#5 Levels: A1 A2 A3 ... A5

#[[2]]
#[1] A1 A2 A4
#5 Levels: A1 A2 A3 ... A5

#[[3]]
#[1] A2
#5 Levels: A1 A2 A3 ... A5

您的id列当前为factor类型。如果您不想看到输出中的级别,只需将其转换为字符,即
dftest$id另一个选项可以是使用
mapply
,将1/0数据转换为逻辑数据,并将每列中相应的
id
s子集,以获得
id
s列表

mapply(`[`, dftest["id"], data.frame(dftest[-1] == 1), USE.NAMES = FALSE)

#[[1]]
#[1] "A1" "A4"

#[[2]]
#[1] "A1" "A2" "A4"

#[[3]]
#[1] "A2"
数据

dftest <- data.frame(id = c("A1","A2","A3","A4","A5"),
                     stock1= c(1,0,0,1,0), 
                     stock2 = c(1,1,0,1,0), 
                     stock3 = c(0,1,0,0,0), stringsAsFactors = FALSE)

dftest另一个选项可以是使用
mapply
,将1/0数据转换为逻辑数据,并从每列中子集相应的
id
s,以获得
id
s的列表

mapply(`[`, dftest["id"], data.frame(dftest[-1] == 1), USE.NAMES = FALSE)

#[[1]]
#[1] "A1" "A4"

#[[2]]
#[1] "A1" "A2" "A4"

#[[3]]
#[1] "A2"
数据

dftest <- data.frame(id = c("A1","A2","A3","A4","A5"),
                     stock1= c(1,0,0,1,0), 
                     stock2 = c(1,1,0,1,0), 
                     stock3 = c(0,1,0,0,0), stringsAsFactors = FALSE)

dftest玩弄
数据。表

library(data.table)
data.table::melt(dftest, id.vars = "id")[as.logical(value), list(list(id)), by = variable][[2]]

[[1]]
[1] A1 A4
Levels: A1 A2 A3 A4 A5

[[2]]
[1] A1 A2 A4
Levels: A1 A2 A3 A4 A5

[[3]]
[1] A2
Levels: A1 A2 A3 A4 A5

玩弄
数据。表

library(data.table)
data.table::melt(dftest, id.vars = "id")[as.logical(value), list(list(id)), by = variable][[2]]

[[1]]
[1] A1 A4
Levels: A1 A2 A3 A4 A5

[[2]]
[1] A1 A2 A4
Levels: A1 A2 A3 A4 A5

[[3]]
[1] A2
Levels: A1 A2 A3 A4 A5

这里有一个带有
tidyverse

library(tidyverse)
gather(dftest, key, val, -id) %>% 
    filter(val == 1) %>%
    group_split(key) %>%
     map(pluck, 'id')
#[[1]]
#[1] A1 A4
#Levels: A1 A2 A3 A4 A5

#[[2]]
#[1] A1 A2 A4
#Levels: A1 A2 A3 A4 A5

#[[3]]
#[1] A2
#Levels: A1 A2 A3 A4 A5

或者使用
map

map(dftest[-1], ~ as.character(dftest$id)[!! .x])
#$stock1
#[1] "A1" "A4"

#$stock2
#[1] "A1" "A2" "A4"

#$stock3
#[1] "A2"
或者使用
map
discard

map(dftest[-1], ~ discard(dftest$id, !.x))

或者使用
split

with(subset(cbind(dftest['id'], stack(dftest, -id)), 
          values == 1), split(as.character(id), ind))
#$stock1
#[1] "A1" "A4"

#$stock2
#[1] "A1" "A2" "A4"

#$stock3
#[1] "A2"
或者通过复制“id”列和
名称来使用
split

split(dftest[col(dftest[-1])][c(!!dftest[-1])], 
         names(dftest)[-1][col(dftest[-1])][c(!!dftest[-1])])

这里有一个带有
tidyverse

library(tidyverse)
gather(dftest, key, val, -id) %>% 
    filter(val == 1) %>%
    group_split(key) %>%
     map(pluck, 'id')
#[[1]]
#[1] A1 A4
#Levels: A1 A2 A3 A4 A5

#[[2]]
#[1] A1 A2 A4
#Levels: A1 A2 A3 A4 A5

#[[3]]
#[1] A2
#Levels: A1 A2 A3 A4 A5

或者使用
map

map(dftest[-1], ~ as.character(dftest$id)[!! .x])
#$stock1
#[1] "A1" "A4"

#$stock2
#[1] "A1" "A2" "A4"

#$stock3
#[1] "A2"
或者使用
map
discard

map(dftest[-1], ~ discard(dftest$id, !.x))

或者使用
split

with(subset(cbind(dftest['id'], stack(dftest, -id)), 
          values == 1), split(as.character(id), ind))
#$stock1
#[1] "A1" "A4"

#$stock2
#[1] "A1" "A2" "A4"

#$stock3
#[1] "A2"
或者通过复制“id”列和
名称来使用
split

split(dftest[col(dftest[-1])][c(!!dftest[-1])], 
         names(dftest)[-1][col(dftest[-1])][c(!!dftest[-1])])
或者
lappy(dftest[-1],FUN=function(x)dftest$id[as.logical(x)])
或者
lappy(dftest[-1],FUN=function(x)dftest$id[as.logical(x)]