【问题标题】:Apply Function to create dataset from the dataframes column应用函数从数据框列创建数据集
【发布时间】:2016-11-29 05:29:01
【问题描述】:

我有一个如下所示的数据集

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

其余列以此类推。

【问题讨论】:

  • 分享可重现的数据,而不是图片!其次,到目前为止您尝试过什么?

标签: r apply lapply sapply mapply


【解决方案1】:

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

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")

【讨论】:

  • 我收到错误,例如名称错误(x1)[3]
  • @Shivpe_R 更正后更新了帖子。之前忘记分配了
【解决方案2】:

这将为您提供每个变量的子集。 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]]

【讨论】:

  • 有帮助,如果有对象名作为对应的列名会更有帮助。
  • 你指的是这个列表“l”中每个元素的名称吗?
  • 有什么办法可以用列名代替列索引吗?
  • 您能详细说明一下吗?
【解决方案3】:

这将在需要使用 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

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 2021-11-11
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多