应用函数从数据框列创建数据集

Apply Function to create dataset from the dataframes column

我有如下所示的数据集

挑战在于对从第 3 列到最后的列应用函数。 该函数应过滤数据集,列只有 false 并按名称作为列名称创建数据框,如下所示的第 3 列和第 4 列 并且有很多可用的列,我必须使用应用功能。谁能给个解决办法

其余列依此类推。

我们可以使用 Map 创建一个 list of 'data.frame`s

nm1 <- names(df1)[3:ncol(df1)]
lst <- setNames(Map(function(x,y) {
               x1 <- cbind(df1[1:2], x)[!x,]
               names(x1)[3] <- y
               x1 },
          df1[3:ncol(df1)], nm1), nm1) 
lst
#$LOGICCOLUMN1
#  COLUMN1 COLUMN2 LOGICCOLUMN1
#6    FFFF    jjjj        FALSE
#8    HHHH    BBBB        FALSE

#$LOGICCOLUMN2
#  COLUMN1 COLUMN2 LOGICCOLUMN2
#1    AAAA    EEEE        FALSE
#4    DDDD    HHHH        FALSE
#5    EEEE    llll        FALSE

#$LOGICCOLUMN3
#   COLUMN1 COLUMN2 LOGICCOLUMN3
#2     BBBB    FFFF        FALSE
#8     HHHH    BBBB        FALSE
#10    jjjj    DDDD        FALSE

最好将其保留为列表。但是如果我们真的需要在全局环境中有对象(不推荐)

list2env(lst, .GlobalEnv)
LOGICCOLUMN1
#  COLUMN1 COLUMN2 LOGICCOLUMN1
#6    FFFF    jjjj        FALSE
#8    HHHH    BBBB        FALSE

数据

df1 <- structure(list(COLUMN1 = c("AAAA", "BBBB", "CCCC", "DDDD", "EEEE", 
"FFFF", "GGGG", "HHHH", "llll", "jjjj"), COLUMN2 = c("EEEE", 
"FFFF", "GGGG", "HHHH", "llll", "jjjj", "AAAA", "BBBB", "CCCC", 
"DDDD"), LOGICCOLUMN1 = c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, 
TRUE, FALSE, TRUE, TRUE), LOGICCOLUMN2 = c(FALSE, TRUE, TRUE, 
FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE), LOGICCOLUMN3 = c(TRUE, 
FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)), .Names = c("COLUMN1", 
"COLUMN2", "LOGICCOLUMN1", "LOGICCOLUMN2", "LOGICCOLUMN3"), row.names = c(NA, 
-10L), class = "data.frame")

这将为您提供每个变量的子集。 TRUE 和 FALSE 的。希望这对你也有帮助!

我将解释代码,因为您可能需要对其进行更改才能使用您的数据。请分享可重现的数据供我们直接处理! 我从第 3 列开始迭代,对于每一列,我将 dlply 应用于 groupby TRUE/FALSE

library(plyr)
l=lapply(3:dim(df)[2], function(i) dlply(df[c(1:2,i)], colnames(df)[i])$`FALSE`)
names(l) <- colnames(df)[3:dim(df)[2]]

当需要使用 Colnames 而不是列索引时,这将被解决,但是只是额外的功能 @joel.wilson 所做的

colmnnames <- c('COLUMN1','COLUMN2') 
c <- setdiff(colnames(dataset),colmnnames) 
l <- lapply(1:length(c), function(i) dlply(dataset[c(colmnnames,c[i])],colnames(dataset)[grep(c[i],colnames(dataset))])$`FALSE`) 
names(l) <- c 
l