Печать имени столбца внутри функции lapply

Я поискал в архивах, но не нашел подходящего ответа. Я новичок и прошу прощения за мое невежество, если я задаю очень элементарный вопрос. Я пытаюсь заставить функцию apply печатать имена столбцов во время обработки через фрейм данных. Я понимаю, что lapply преобразует столбец фрейма данных в вектор, но это их способ распечатать имя столбца при выводе на печать. Как в следующем примере

   > 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])})

Я хочу, чтобы выходные данные отображали имя столбца, который он обрабатывает, при печати выходной таблицы. Прямо сейчас в таблицах непредвиденных обстоятельств он выводит только «x».


person user3262944    schedule 02.02.2014    source источник


Ответы (2)


Предполагая, что функция 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
===============================
person Sandy Muspratt    schedule 03.02.2014

Хорошо, это старый, но я столкнулся с той же проблемой и хотел поделиться своим подходом, хотя он в некоторой степени нарушает идею * apply. Плюс в том, что в цикл можно интегрировать что угодно. Поэтому мне нужно было запустить ANOVA для двух выходных переменных, в зависимости от столбцов, которые я пропустил с помощью lapply, получить p_values ​​для аннотирования графика и создания нескольких графиков рядом. Суть в том, что он сочетает в себе цикл for с 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)
})
}
person Elena    schedule 18.10.2017