循环遍历R中的多个列

时间:2017-08-14 20:07:45

标签: r loops

我有以下代码,我想在名为ccc的数据框中运行多个列。

ccc %>% 
  group_by(LA) %>%
  summarise(Def = sum(DefaultOct05 == 'Def'),
            NDef = sum(DefaultOct05 != 'Def'),
            DRate = mean(DefaultOct05 == 'Def'))

LA是其中一个专栏的名称。如何设置循环以运行多个不同的列?

我尝试了以下内容。

for (i in 26:ncol(ccc)) {
    ccc %>% 
        group_by(i) %>%
        summarise(Def = sum(DefaultOct05 == 'Def'),
                  NDef = sum(DefaultOct05 != 'Def'),
                  DRate = mean(DefaultOct05 == 'Def'))
}

但是我收到以下错误消息。

resolve_vars(new_groups,tbl_vars(.data))出错:   未知变量分组依据:i

2 个答案:

答案 0 :(得分:0)

大多数人会在您的问题中遗漏的是可重现的数据集。没有它,通常很难重现你的问题并解决它。

如果我说得对,你的数据集如上所示:

set.seed(1)
ccc=data.frame(Default=sample(c(0,1),100,replace = TRUE),LA=sample(c("X","Y","Z"),100,replace = TRUE),DC=sample(c("A","B","C"),100,replace = TRUE))

do.call() - 将rbind()应用于后续元素。 lapply(dat,function(x))将函数应用于dat的每个元素 - 在我们的case列中。

library(dplyr)
do.call(rbind,lapply(ccc, function(Var) {  
  dat=data.frame(Var,Default=ccc$Default) %>% group_by(Var) %>% summarise(Def=sum(Default),NDef=n()-sum(Default),DRate=mean(Default))
  return(as.data.frame(dat))


}
))

答案 1 :(得分:0)

  

“LA是其中一个列的名称”

实际上,按dplyr构造分组可以处理列内的变量。我想你想做其他事情。

如果要将相同的功能应用于不同的列,可以使用summarize_at。

df <- data.frame( id = c(1:20),
              a1 = runif(20),
              b1 = runif(20),
              c1 = runif(20) 
              )

library(dplyr)

df %>% summarise_at(c("a1","b1","c1"), funs(med = median,
                                             avr = mean))

# result: 
# a1_med    b1_med    c1_med    a1_avr    b1_avr    c1_avr
# 1 0.6444056 0.5266252 0.6420554 0.5605837 0.4983654 0.5546381