在lapply函数中打印列名

时间:2014-02-02 14:59:44

标签: r lapply

我搜索了档案但没有找到合适的答案。我是一个初学者,如果我提出一个非常基本的问题,请原谅我的无知。我试图让apply函数在处理数据帧时打印列名。我理解lapply将数据框的列转换为vector,但是它是在打印输出时打印列名的方法。如下例所示

   > mydata<-data.frame(matrix(rep(c(1:2),times= 50),20,5))
   > colnames(mydata)<-letters[1:5]
   > lapply(mydata[,2:4],function(x){CrossTable(x,mydata[,5])})

我希望输出在打印输出表时显示正在处理的列名。它只打印&#34; x&#34;现在在列联表中。

2 个答案:

答案 0 :(得分:0)

假设CrossTable()包中包含descr函数,dnn的参数似乎在交叉表中给出了行名和列名。诀窍是让lapply同时读取名称和数据。 names(mydata)[2:4]给出了名字; mydata[, 2:4]是数据。 lapply的语法是:

lapply(x, FUN, ...)

FUN适用于x的每个元素,而...允许将可选参数传递给FUN。因此,names(mydata)[2:4]mydata[, 2:4]都可以传递FUN

mydata<-data.frame(matrix(rep(c(1:2),times= 50),20,5))
colnames(mydata)<-letters[1:5]

library(descr)

lapply(names(mydata)[2:4], 
   function(dfNames, dfData) {
      return(CrossTable(dfData[[dfNames]], mydata[,5], dnn = c(dfNames, "mydata[,5]")))
}, mydata[, 2:4] )

该函数对names(mydata)[2:4]中的每个元素进行操作,数据文件作为附加参数传递。这样,相关列(dfData[[dfNames]])和相关列的名称(dfName)可供CrossTable.

使用
[[1]]
   Cell Contents 
|-------------------------|
|                       N | 
| Chi-square contribution | 
|           N / Row Total | 
|           N / Col Total | 
|         N / Table Total | 
|-------------------------|

===============================
          mydata[,5]
b             1       2   Total
-------------------------------
1            10       0      10
          5.000   5.000        
          1.000   0.000   0.500
          1.000   0.000        
          0.500   0.000        
-------------------------------
2             0      10      10
          5.000   5.000        
          0.000   1.000   0.500
          0.000   1.000        
          0.000   0.500        
-------------------------------
Total        10      10      20
          0.500   0.500
===============================

[[2]]
   Cell Contents 
|-------------------------|
|                       N | 
| Chi-square contribution | 
|           N / Row Total | 
|           N / Col Total | 
|         N / Table Total | 
|-------------------------|

===============================
          mydata[,5]
c             1       2   Total
-------------------------------
1            10       0      10
          5.000   5.000        
          1.000   0.000   0.500
          1.000   0.000        
          0.500   0.000        
-------------------------------
2             0      10      10
          5.000   5.000        
          0.000   1.000   0.500
          0.000   1.000        
          0.000   0.500        
-------------------------------
Total        10      10      20
          0.500   0.500
===============================

[[3]]
   Cell Contents 
|-------------------------|
|                       N | 
| Chi-square contribution | 
|           N / Row Total | 
|           N / Col Total | 
|         N / Table Total | 
|-------------------------|

===============================
          mydata[,5]
d             1       2   Total
-------------------------------
1            10       0      10
          5.000   5.000        
          1.000   0.000   0.500
          1.000   0.000        
          0.500   0.000        
-------------------------------
2             0      10      10
          5.000   5.000        
          0.000   1.000   0.500
          0.000   1.000        
          0.000   0.500        
-------------------------------
Total        10      10      20
          0.500   0.500
===============================

答案 1 :(得分:0)

好的,这已经过时了,但我遇到了同样的问题,想要分享我的方法,尽管它在某种程度上违反了*应用的想法。好处是:你可以在循环中集成任何东西。所以我需要在2个输出变量上运行ANOVA,这取决于我用lapply循环的列,获取p_values来注释绘图并并排创建多个绘图。 核心是它结合了for-loop和lapply

for (i in 0:10){
i<-i+1
lapply(df[i],function(x) {
  myfactor<-names(df)[i] #gets the column name
  anova_model_a<-lm(a~x,df) #needed to run ANOVA per column
  anova_model_b<-lm(b~x,df) #needed to run ANOVA per column
  tab_aov_a<-tidy(summary(anova_model_a)) #proper result table
  tab_aov_b<-tidy(summary(anova_model_b)) #proper result table
  labels_a <- data.frame(drv = "1", label=c(round(tab_aov_a$p.value[2],4))) #needed for labelling the graph. I only had 2 groups for comparison
  labels_b <- data.frame(drv = "1", label=c(round(tab_aov_b$p.value[2],4))) #needed for labelling the graph
  fig1<-ggplot(df,aes(x,a))+
    geom_boxplot()+
    ggtitle("a")+
    geom_text(data=labels_a,aes(x=drv,y=12,label=label),colour="blue",angle=0,hjust=0.5, vjust=0.5,size=5)+
    xlab(myfactor)

  fig2<-ggplot(df,aes(x,b))+
    geom_boxplot()+
    ggtitle("b")+
    geom_text(data=labels_b,aes(x=drv,y=6,label=label),colour="blue",angle=0,hjust=0.5, vjust=0.5,size=5)+
    xlab(myfactor)
  arrangement<-grid.arrange(fig1,fig2,nrow=2)
  print(arrangement)
})
}